【问题标题】:Dealing with currency in PHP - decimal places & number_format()在 PHP 中处理货币 - 小数位和 number_format()
【发布时间】:2010-12-07 10:15:51
【问题描述】:

我需要在 2dp 中存储代表货币金额的数字,以便输出到屏幕上。相同的数字在格式化后可以用数学函数进行更改。我确定我记得过去由于数字格式的数字被视为字符串而出现错误,而千位分隔符是导致问题的原因,但下面的脚本运行时没有错误。

PHP 的松散数据类型是否可以节省时间?相对较新的 PHP 版本有什么变化吗?如果不是,在其他情况下number_format() 仍然会因为数字是字符串而导致数学函数失败?

echo round(1111123.2, 2); //included to demonstrate how it can't be used for this purpose
echo "<br />";
echo number_format(1111123.2, 2);
echo "<br />";
$num = number_format(1111123.2, 2);
echo number_format($num / 42, 2);

// output
1111123.2
1,111,123.20
0.02

【问题讨论】:

    标签: php number-formatting


    【解决方案1】:

    相同的数字在格式化后可以用数学函数改变

    永远不要这样做。例如,当您使用非英文小数分隔符格式化数字时,它一定会以泪水告终。对原始数值进行运算,然后在输出前立即格式化。

    【讨论】:

      【解决方案2】:

      这是由于 PHP 完成了自动类型转换。据我了解,PHP 将能够在大多数通用数学函数中将类型转换为数字,但仍然不能明确地确定这一点。 字符串被转换为所需的变量类型

      【讨论】:

        【解决方案3】:

        嗯...最好的办法是使用“真实”数字(floatdoubleint)存储和计算,并使用 number_format() 仅用于表示。
        但是,如果您需要使用从number_format() 返回的数字进行计算,请考虑编写类似的函数

        function unNumber_Format($str) {
           $search  = array(',', '$', '€');
           $replace = array('', '', '');
        
           return (double) str_replace($search, $replace, $str);
        }
        

        并像使用它

        echo number_format(unNumber_Format($num) / 42, 2);
        

        你很好! ;-)

        【讨论】:

          【解决方案4】:

          更好的是使用数字格式化类:

          但是它需要启用 intl 扩展和 php 5.3.0+.. (sudo apt-get install php5-intl)

          $f = NumberFormatter::create("en-US",NumberFormatter::CURRENCY);
          var_dump($f->format(1111123.2));
          $f = NumberFormatter::create("en-US",NumberFormatter::CURRENCY);
          $f->setSymbol(NumberFormatter::CURRENCY_SYMBOL,"€");
          var_dump($f->format(1111123.2));
          $f = NumberFormatter::create("de_DE",NumberFormatter::CURRENCY);
          var_dump($f->formatCurrency(1111123.2,"EUR"));
          $f = NumberFormatter::create("it_IT",NumberFormatter::CURRENCY);
          var_dump($f->formatCurrency(1111123.2,"USD"));
          $f = NumberFormatter::create("sk_SK",NumberFormatter::CURRENCY);
          var_dump($f->formatCurrency(1111123.2,"USD"));
          

          返回:

          string(13) "$1,111,123.20"
          string(15) "€1,111,123.20"
          string(17) "1.111.123,20 €"
          string(17) "US$ 1.111.123,20"
          string(19) "1 111 123,20 US$"
          

          如果您的客户来自不同的国家/地区,只需为他们存储区域设置,他们就会得到预定义的号码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-16
            • 1970-01-01
            • 2016-04-20
            • 1970-01-01
            • 1970-01-01
            • 2011-04-18
            • 1970-01-01
            相关资源
            最近更新 更多