3

我在这里结束了一点点矫枉过正,但我​​似乎不知道如何解决它:

$formatter = new NumberFormatter('lv_LV', NumberFormatter::DECIMAL);

$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::DECIMAL_ALWAYS_SHOWN, 2);

我在这里想要实现的是:

+-------+--------+----------+-------+
| INPUT | ACTUAL | EXPECTED | VALID |
+-------+--------+----------+-------+
|  5,77 |   5.77 |     5.77 | YES   |
|  5,20 |    5.2 |     5.20 | NO    |
|  5,00 |      5 |     5.00 | NO    |
|     0 |      0 |     0.00 | NO    |
+-------+--------+----------+-------+

简而言之,我总是希望浮点数落后 2 位。

如何使用 PHP 的NumberFormatter实现这一点?

4

2 回答 2

10

接受的答案是正确的,我希望澄清为什么 OP 没有收到预期的结果NumberFormatter

NumberFormatter::parseoutput接受float并接受string指定语言环境格式的参数。但是 Parse 不会格式化输出。相当于执行echo (float) '5.20'; //(float) 5.2

NumberFormatter::formatoutput采用string指定的语言环境格式并接受integerorfloat参数。它相当于执行echo number_format(5.2, 2); //(string) "5.20"但是number_format使用默认值作为分数和千位分隔符,它们需要根据所需的显示规则进行更改。

NumberFormatter要求您在调用该parse方法之前调用该format方法,以便将特定于语言环境的字符串值转换为等效的整数或浮点值,并NumberFormatter为您所需的输出提供单独的值。

示例https://3v4l.org/HRnQN

$lv = new \NumberFormatter('lv', \NumberFormatter::DECIMAL);
$lv->setAttribute($input::FRACTION_DIGITS, 2); //applies rounding during format

$en = new \NumberFormatter('en', \NumberFormatter::DECIMAL);
$en->setAttribute($output::FRACTION_DIGITS, 2); //applies rounding during format

foreach (['5,77', '5,20', '5,2', '5,00', '5', '0'] as $value) {
   $parsed = $lv->parse($value);
   var_dump($parsed); //convert locale string to float value
   var_dump($en->format($parsed)); //convert float to locale string
   var_dump($lv->format($parsed)); //convert float to locale string
   echo "<br/>\n";
}

$lv::parse($值)

+-------+--------+----------+-------+
| Value |  Parse | EXPECTED | VALID |
+-------+--------+----------+-------+
|  5,77 |   5.77 |     5.77 | YES   |
|  5,20 |    5.2 |      5.2 | YES   |
|   5,2 |    5.2 |      5.2 | YES   |
|  5,00 |      5 |        5 | YES   |
|     5 |      5 |        5 | YES   |
|     0 |      0 |        0 | YES   |
+-------+--------+----------+-------+

$en::format($parsed)

+-------+--------+----------+-------+
| Value | Format | EXPECTED | VALID |
+-------+--------+----------+-------+
|  5,77 |   5.77 |     5.77 | YES   |
|  5,20 |   5.20 |     5.20 | YES   |
|   5,2 |   5.20 |     5.20 | YES   |
|  5,00 |   5.00 |     5.00 | YES   |
|     5 |   5.00 |     5.00 | YES   |
|     0 |   0.00 |     0.00 | YES   |
+-------+--------+----------+-------+

$lv::格式($解析)

+-------+--------+----------+-------+
| Value | Format | EXPECTED | VALID |
+-------+--------+----------+-------+
|  5,77 |   5,77 |     5,77 | YES   |
|  5,20 |   5,20 |     5,20 | YES   |
|   5,2 |   5,20 |     5,20 | YES   |
|  5,00 |   5,00 |     5,00 | YES   |
|     5 |   5,00 |     5,00 | YES   |
|     0 |   0,00 |     0,00 | YES   |
+-------+--------+----------+-------+
于 2016-07-06T20:20:16.917 回答
0

您应该使用http://php.net/manual/en/function.number-format.php

$var = number_format(553,2);
echo $var

其中 553 是数字,2 是要显示的小数位数。它会输出

553,00

NumberFormatter 有一种处理货币的方式,如果这是你在 http://php.net/manual/en/function.money-format.php之后的方式

于 2013-07-22T14:40:26.313 回答