【问题标题】:PHP money_format padded number groupingPHP money_format 填充数字分组
【发布时间】:2012-11-13 23:00:58
【问题描述】:

基本上,我试图在一个排列整齐的列中输出一堆数字,格式如下:

$##,###.##
$##,###.##

使用以下代码

setlocale(LC_MONETARY, 'en_US.utf8');
money_format('%=0(#5.2n',$sum)

$sum 小于 1000 时除外。例如,使用

$sum=1550.00;

(如预期)上述代码输出

$01,550.00 

然而,与

$sum=167.00;

上面的sn-p输出

$000167.00

这显然不是我需要的。根据documentation

即使填充字符是数字,分组分隔符也不会应用于填充字符。

所以,这是函数的预期行为。似乎没有意义,但这就是它的工作原理。

任何关于如何正确格式化填充数字的建议将不胜感激。

谢谢!

【问题讨论】:

  • 如果您考虑到通常的填充字符是空格,则该函数完全有意义。我不建议使用零,也建议不要使用逗号或点作为分组分隔符——它们在世界的另一半很容易被误认为是小数分隔符。每个数字一个点或逗号 - 每个人都会将此作为小数分隔符。
  • 谢谢你的建议,斯文。但是,这种格式是业务需求,我对输出时的外观没有发言权。它是应用程序的面向内部的部分,不会暴露给那些可能将逗号误认为点的人,反之亦然。另外,我明白你所说的关于以这种方式接近的功能是有意义的。尽管如此,我仍然需要更一致的外观行为,因此,这篇文章。

标签: php formatting numbers


【解决方案1】:

您可以构建自己的格式化函数。 localeconv() 将为您提供分隔符等数据以及货币符号的位置。这是我使用的,符合我的需要:

function my_number_format($amount) {
    // Get separators
    $l = localeconv();

    $str = number_format($amount, 2, $l['decimal_point'], $l['thousands_sep']);

    // manual padding
    while (strlen(preg_replace('/[^0-9]/', '', $str)) < 10) {
        $init = preg_replace('/[^0-9].*/', '', $str); // initial all-digit sequence
        $str = '0' . (strlen($init) == 3 ? $l['thousands_sep'] : '') . $str; 
    }

    return $amount;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 2021-12-16
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2017-01-07
    • 2019-03-06
    相关资源
    最近更新 更多