web-dev-qa-db-ja.com

通貨テキストを10進数型に解析する際の問題

「$ 45.59」などの文字列を10進数に解析しようとしています。何らかの理由で、入力が正しい形式ではないという例外が発生しています。これはグローバルなプログラムにはならないので、ローカリゼーションに関するすべてのことは気にしません。これが私がやっていることです。問題はありますか?

NumberFormatInfo MyNFI = new NumberFormatInfo(); 
MyNFI.NegativeSign = "-"; 
MyNFI.NumberDecimalSeparator = "."; 
MyNFI.NumberGroupSeparator = ",";
MyNFI.CurrencySymbol = "$"; 
decimal d  = decimal.Parse("$45.00", MyNFI);    // throws exception here...
48
PICyourBrain

使用方法:

decimal d = decimal.Parse("$45.00", NumberStyles.Currency);

Decimal.Parse のMSDNドキュメントには次のように記載されています。

「sパラメータは、NumberStyles.Numberスタイルを使用して解釈されます。これは、空白と3桁の区切り記号は許可されますが、通貨記号は許可されないことを意味します。 sに存在する場合は、Decimal.Parse(String、NumberStyles、IFormatProvider)メソッドを使用します

102
John Koerner

このようにそれは私のために働く:

NumberFormatInfo MyNFI = new NumberFormatInfo();
MyNFI.NegativeSign = "-";
MyNFI.CurrencyDecimalSeparator = ".";
MyNFI.CurrencyGroupSeparator = ",";
MyNFI.CurrencySymbol = "$";

decimal d = decimal.Parse("$45.00", NumberStyles.Currency, MyNFI);

1.)数値区切り記号の代わりに通貨区切り記号を定義する必要があります。 2.)通貨値のみを定義したため、解析中にNumberStyles.Currencyを定義する必要があります。

14
MEN

@JohnKoernerからコードを実行しようとすると、例外:System.FormatException、メッセージ"Input string was not in a correct format."で失敗します。 @MENの答えは役に立ちましたが、受け入れられた答えとその問題を修正する方法についての洞察を追加したかったのです。

@MENと同じように、.Parse()メソッドが正しく機能する前にNumberFormatInfoを含める必要がありました。ただし、CurrencyDecimalSeparatorで小数を指定する必要はありませんでした。番号に必要なすべてのプロパティを含める必要があります。クラス定義ドキュメントのリストは次のとおりです。

MSDNドキュメント-NumberFormatInfoクラス

私の実装では負の数値は決して得られないので、それを含めないことにしました。私が持っているものは次のとおりです。

string currencyAmount = "$45.00";

NumberFormatInfo FormatInfo = new NumberFormatInfo();
FormatInfo.CurrencyGroupSeparator = ",";
FormatInfo.CurrencySymbol = "$";

// Result: 45.00
decimal parsedCurrency = decimal.Parse(currencyAmount, NumberStyles.Currency, FormatInfo);
0
kbpontius