8

我正在使用 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 文档(这是用于实现 NumberFormatter 的库),以下内容看起来很有希望:

¤ (\u00A4) : 前缀或后缀 : 无货币符号,由货币符号代替。如果加倍,则替换为国际货币符号。如果是三倍,则替换为货币复数名称,例如美国的“美元”或“美元”。如果存在于模式中,则使用货币小数分隔符而不是小数分隔符。

但是这个:

$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-¤");

只打印“-¤123”,所以没有乐趣。

编辑3:我想我找到了答案,见下文。

4

3 回答 3

15

我找到了一种稍微不那么老套的方法来将 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
于 2009-07-22T08:50:40.717 回答
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);
于 2014-11-28T21:46:08.393 回答
-1

简单地你可以做

$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";
于 2016-07-29T11:51:48.270 回答