我使用的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";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top