代码之家  ›  专栏  ›  技术社区  ›  John Carter

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

  •  9
  • John Carter  · 技术社区  · 16 年前

    我正在使用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" .

    编辑:

    看着 Intl library docs

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

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

    编辑3:

    3 回复  |  直到 16 年前
        1
  •  17
  •   John Carter    16 年前

    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
    
        2
  •  2
  •   Johnny Dew    11 年前

    这样做,你有点破坏了本地化的意义。因为?代表美元符号,你的模式总是把符号放在数字的开头,但并非每种货币都是这样。如果你想删除括号,我会这样做,

    $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);
    
        3
  •  -1
  •   vikram eklare    9 年前

    $cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";
    
    推荐文章