从价格中去除多余零的有效方法?
Posted
技术标签:
【中文标题】从价格中去除多余零的有效方法?【英文标题】:Efficient way of removing extraneous zeros from prices? 【发布时间】:2014-12-05 04:34:57 【问题描述】:我将价格存储到小数点后五位,例如:
1.95000
2.25000
0.01150
2.10000
2.00000
显示价格时,如果其余数字为零,我想显示标准 $X.XX
格式,但如果有有效数字,我不想将它们删掉(所以我可以' t 简单地使用number_format()
)。
例如,上述价格应显示为:
1.95
2.25
0.0115
2.10
2.00
这个过程必须在每页数百个价格上完成。以这种方式格式化数字的有效方法是什么?
【问题讨论】:
如果有用的话试试这个:echo (float)$pricestring; @Chandresh 当小数点右边的数字是0
时,不保留两位小数。例如 echo (float)'2.00'
导致 2
。
你推荐过这个吗?-***.com/questions/14531679/…
【参考方案1】:
这使用正则表达式来匹配尾随 0 之前的所有内容
$i = "$1.00";
$pattern = '/\$(\d+)\.(\d\d)(0*)/';
$replacement = '\$$1.$2';
print preg_replace($pattern,$replacement,$i);
在小数点右侧前 2 位之后的所有内容上使用 rtrim
的另一种方式
$pos = strpos($i, '.') + 3;
print substr($i, 0, $pos) . rtrim(substr($i, $pos), '0');
【讨论】:
我几乎开始尝试为此编写一个正则表达式,然后对自己说“不……必须有更好的方法!” @Nate 我认为没有,因为您正在寻找两个显式参数:四舍五入 0 + 保留至少 2 个小数位。您可以单独检查每个或正则表达式。编辑:该死的 单线的substr($i, 0, strpos($i, '.') + 2) . rtrim(substr($i, strpos($i, '.') + 2), '0')
怎么样?您可以将 strpos
放入另一个变量中,但可以缩短执行时间。
@sjagr 同意,这是一种更快的方法【参考方案2】:
这有点难看,但确实有效:
function formatPrice($price)
$out = (float)$price; // Trim off right-hand 0's
$out = "$out"; // Typecast back to string
if ((strlen($out) - strpos($out, '.')) <= 2) // Test for string length after decimal point
$out = number_format($out, 2); // Format back with 0's
return $out;
现在正在测试...Works!
感谢@FuzzyTree 的回答,这是我其他评论中的一个单行函数:
function formatPrice($price)
return substr($price, 0, strpos($price, '.') + 3) . rtrim(substr($price, strpos($price, '.') + 3), '0');
【讨论】:
你想用你在另一个答案上留下的评论来更新你的答案吗?你的单线工作,虽然我不得不将+ 2
更改为+ 3
。
@Nate 当然,完成!不过我已经added my comment to that answer以上是关于从价格中去除多余零的有效方法?的主要内容,如果未能解决你的问题,请参考以下文章
测试 256 位 YMM AVX 寄存器元素是不是等于或小于零的最有效方法