从价格中去除多余零的有效方法?

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 寄存器元素是不是等于或小于零的最有效方法

如何通过 bigQuery 从谷歌分析中有效地获取价格和 ID

Laravel:验证大于零的数字失败

去除winrar的弹窗广告方法(亲测有效)

在 NumPy 数组中查找等于零的元素的索引

腋下狐臭用做手术吗?如何安全有效的去除狐臭