web-dev-qa-db-ja.com

通貨文字列をダブルに変換します

SQLサーバーに複数の通貨を保存する必要があります。 SQLは、すべての異なる種類の通貨をサポートするわけではないことを理解しています(文字列として格納しない限り、それを行いたくありません)。

私のアイデアは、すべての値を通貨形式から標準のdoubleに変換し、代わりに保存することでした。次に、表示するときにカルチャ情報に基づいて再フォーマットします。しかし、私は例えば.

var cultureInfo = new System.Globalization.CultureInfo("en-US");
double plain = return Double.Parse("$20,000.00", cultureInfo);

これは動作しないようで、常にFormatExceptionをスローします。通貨記号を削除して、数値だけに基づいてこれを実行しようとするだけでも同じことが行われます。これは、ほぼすべての種類の通貨をサポートしたい例です。

通貨を取り除き、価値を倍にする標準的な方法はありますか?

38
James

私はこれがうまくいくと思う:

double.Parse(currencyValue, NumberStyles.Currency);

ここでは、 NumberStyles の詳細を確認できます。

編集:誰かが他の回答/コメントを見ずにこの回答を見た場合、この回答は書かれた質問に答えましたが、通貨をdoubleとして保存することは良い考えではなく、使用する方が良いでしょう- decimal 代わりに。

95
Hans Olsson

NumberStylesをParse関数に渡す必要があります

Decimal.Parse("$20,000.00", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, new CultureInfo("en-US"));

通貨については、Decimalを使用することをお勧めします。そして、これは大したことではないかもしれませんが、通貨データをMoneyとしてDBに保存し、通貨コードを追加して値の通貨を識別する方が良いかもしれません。

はい、そして答えはNumberStyles.Currencyの方が良いと示唆しています。まだ文字列を使用したいと考えている場合は、事前に設定された値です。

20
Chris Taylor

Tryparse()を使用することもできます

string input = "$2,000.00";
double parsed = 0d;
double.TryParse(input, NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out parsed))
0
hogarth45