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 ライブラリのドキュメント(NumberFormatter の実装に使用されるライブラリ) を見ると、次のものが有望に見えました。

¤ (\u00A4) : プレフィックスまたはサフィックス : 通貨記号なし、通貨記号に置き換え。2 倍の場合は、国際通貨記号に置き換えられます。3 倍になっている場合は、通貨の複数形の名前に置き換えられます。たとえば、「US ドル」やアメリカの「US ドル」などです。パターンに存在する場合、小数点記号の代わりに通貨の小数点記号が使用されます。

でもこれは:

$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 に答える