DOBON.NET DOBON.NETプログラミング掲示板過去ログ

符号付き数値を通貨表示する書式指定について

環境/言語:[XP, Vista, VB.NET, C#]
分類:[.NET]

書式文字列で質問です。

数値を書式指定で通貨表示したいのですが、書式文字列「C」ですと符号付きの場合

Console.WriteLine(String.Format("{0:C}", -12000))

結果:-\12,000

と符号が先頭にきてしまい、こちらが期待する \-12,000 にはなりません。


ちなみにいろいろ試してみました。

Console.WriteLine(String.Format("{0:\#,##0}", -12000))

結果:-#12000

Console.WriteLine(String.Format("{0:\\#,##0}", -12000))

結果:-\12,000

Console.WriteLine(String.Format("{0:\\ #,##0}", -12000))

結果:-\ 12,000

・・・ぜんぶ通貨記号の前に符号が配置されてます。

以下のように通貨記号の後に符号がくるにはどう書式指定したらよいでしょうか?

\-12,000


それとも実はこちらの思い違いで、

-\12,000

が表記的に正しい?
通貨や日付みたいな、カルチャにモロに影響されるものは、プログラム上でカルチャを明示して書式指定すべきです。¥で表示するはずが$になってたりしたら目も当てられません。
さて、通貨の負の値に対する表示パターンは、NumberFormatInfo.CurrencyNegativePattern プロパティで指定されます。
http://msdn.microsoft.com/ja-jp/library/system.globalization.numberformatinfo.currencynegativepattern.aspx
日本固定なら、まず CultureInfo を ja-JP で new し、その NumberFormat 経由で設定するのがいいでしょう。
で、この CultureInfo またはその NumberFormat を、IFormatProvider を受け取る String.Format に渡すようにします(Cultureinfo および NumberFormatInfo はどちらも IFormatProvider インターフェイスを実装しています)。

> それとも実はこちらの思い違いで、
> -\12,000
> が表記的に正しい?
これは、何が正しいというわけでもなく、どうしたいのかによるだけの話でしょう。
私の感性から言うと、通貨記号の方がマイナスより先に来るのが一般的な気がしますね。
ありがとうございます。

> 通貨や日付みたいな、カルチャにモロに影響されるものは、プログラム上でカルチャを明示して書式指定すべきです。¥で表示するはずが$になってたりしたら目も当てられません。

なるほど・・・全くおっしゃる通りです(汗


> さて、通貨の負の値に対する表示パターンは、NumberFormatInfo.CurrencyNegativePattern プロパティで指定されます。
> http://msdn.microsoft.com/ja-jp/library/system.globalization.numberformatinfo.currencynegativepattern.aspx
> 日本固定なら、まず CultureInfo を ja-JP で new し、その NumberFormat 経由で設定するのがいいでしょう。
> で、この CultureInfo またはその NumberFormat を、IFormatProvider を受け取る String.Format に渡すようにします(Cultureinfo および NumberFormatInfo はどちらも IFormatProvider インターフェイスを実装しています)。

そんなクラスがあったのですね!!
早速アプリケーション全体に適用されるよう、Main メソッドの先頭で以下のように実装してみました。


My.Application.ChangeCulture("ja-JP")
My.Application.Culture.NumberFormat.CurrencyNegativePattern = 2 ' $-n 表示


これでメインの EXE だけでなく、EXE から呼び出すライブラリもすべて反映されました。

ちなみにライブラリ側のフォームで GrapeCity の MultiRow を使っているのですが、
書式を "C" に指定したセルが全て

「\-三桁区切りの整数値」

で表示されるのを、複数のフォームで確認できました。本当に助かりました。<(_ _)>


>>それとも実はこちらの思い違いで、
>>-\12,000
>>が表記的に正しい?
> これは、何が正しいというわけでもなく、どうしたいのかによるだけの話でしょう。
> 私の感性から言うと、通貨記号の方がマイナスより先に来るのが一般的な気がしますね。

なるほど・・・パターンが16個も用意されているところをみると、そうなんでしょうね。
今回チェックして気づいた私や顧客の感覚では

「符号が円記号の前にある!!これはおかしい!!」

となったのですが、NumberFormatInfo.CurrencyNegativePattern のヘルプに

「規定値は 0 で、"($n)" を表します。」

とあるところをみると、海外では "($n)" や "-$n" 表記が標準なのかも知れませんね(汗
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板