我正在使用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:查看Intl library docs(用于实现NumberFormatter的库),以下内容看起来很有希望:
¤(\ u00A4):前缀或后缀:无货币符号,替换为货币符号。如果加倍,则用国际货币符号代替。如果是三倍,则替换为货币复数名称,例如美国的“美元”或“美元”。如果存在于模式中,则使用货币小数分隔符而不是小数分隔符。
但是这个:
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-¤");
只需打印“-¤123”,所以没有快乐。
编辑3:我想我找到了答案,见下文。
答案 0 :(得分:14)
我发现将en_US语言环境行为转变为我正在寻找的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
答案 1 :(得分:1)
通过这样做,你有点破坏了本地化的重点。由于¤代表美元符号,并且您告诉您的模式总是将符号放在数字的开头,而不是每种货币的情况。如果你想删除括号,我会更喜欢,
$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);
答案 2 :(得分:0)
只需你可以做
$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";