我怎么NumberFormatter印负货币价值与一个负号?
-
18-09-2019 - |
题
我使用的PHP NumberFormatter 类印刷货币的价值观。
例如:
$cFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$cFormatter->formatCurrency(123, 'USD');
$cFormatter->formatCurrency(123, 'BRL');
$cFormatter->formatCurrency(123, 'GBP');
该工作良好,并返回 "$123.00
", "R$123.00
", "£123.00
"别如预期的那样。
但是,负数是印制"会计风格",四周的方括号,而不是一个导致减"-".
例如:
$cFormatter->formatCurrency(-456, 'USD');
返回 "($456.00)"
, 而我想要的 "-$456.00"
.肯定有一个简单的方式这样做?
我可以删除括号中的复盖的前缀和后缀如下:
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-");
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_SUFFIX, "");
但后来我没有得到任何货币符号,例如: "-456.00"
.
是有一些逃亡代码用的货币符号,我需要使用当设置NEGATIVE_PREFIX属性?
编辑: 我很乐意设置一个不同区域如果给我的结果我要找的。
编辑2: 看 国际图书馆的文档 (这是图书馆用于实现NumberFormatter),下面看起来很有希望:
¤(\u00A4):前缀或后缀:没有货币的标志,替换为货币的象征。如果增加一倍,取代通过国际货币符号。如果增加两倍,替换为货币复数的名字,例如,"美元"或"美元",用于美洲。如果存在一种模式,货币的十进制分离器,而不是使用的十进制分离器。
但是这样的:
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-¤");
只需打印"-¤123",因此没有喜悦。
编辑3: 我想我找到了答案,见下文。
解决方案
我已经找到一个稍微不那么哈克的方式,以弯曲的en_US locale的行为,以我在寻找什么-对 getPattern() / setPattern() 功能。
$cFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$sPattern = $cFormatter->getPattern(); // returns "¤#,##0.00;(¤#,##0.00)";
$sMyPattern = "¤#,##0.00;-¤#,##0.00";
$cFormatter->setPattern($sMyPattern);
$cFormatter->formatCurrency(-456, 'USD'); // returns -$456.00
其他提示
通过这样做,你是有点毁了点的本地化。由于我代表美元登录和你的都告诉你的模式总是把登录开始的数量,而不是这种情况对每一个货币。如果你想要删除括号,我会去的东西更像,
$locale = 'en_US';
$nf = new \NumberFormatter($locale, \NumberFormatter::CURRENCY);
$nf->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, $decimals);
$pattern = str_replace(array('(',')'),'',$nf->getPattern());
$nf->setPattern($pattern);
echo $nf->format($number);
只要你能做
$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";
不隶属于 StackOverflow