如何让NumberFormatter以负号打印负货币值?

Joh*_*ter 7 php currency numberformatter intl

我正在使用PHP NumberFormatter类来打印货币值.

例如:

  $cFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
  $cFormatter->formatCurrency(123, 'USD');
  $cFormatter->formatCurrency(123, 'BRL');
  $cFormatter->formatCurrency(123, 'GBP');
Run Code Online (Sandbox Code Playgroud)

这工作正常,并按预期分别返回"$123.00","R$123.00" "£123.00.

但负数字印在"会计风格"上,用括号括起来,而不是前导减去" - ".

例如:

$cFormatter->formatCurrency(-456, 'USD');
Run Code Online (Sandbox Code Playgroud)

返回"($456.00)",而我想要"-$456.00".当然有一种简单的方法可以做到这一点?

我可以通过覆盖前缀和后缀删除括号,如下所示:

$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-");
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_SUFFIX, "");
Run Code Online (Sandbox Code Playgroud)

但后来我没有货币符号,例如"-456.00".

在设置NEGATIVE_PREFIX属性时,是否需要使用货币符号的转义码?

编辑:我很高兴设置一个不同的区域设置,如果这给了我正在寻找的结果.

编辑2:查看Intl库文档(这是用于实现NumberFormatter的库),以下看起来很有希望:

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

但是这个:

$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-¤");
Run Code Online (Sandbox Code Playgroud)

只需打印"-¤123",就没有喜悦.

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

Joh*_*ter 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
Run Code Online (Sandbox Code Playgroud)