1

文字列を double に変換する必要がありますが、文字列は常に同じ形式ではありません。ある場合は「N0」、別の場合は「#,##」、さらに別の場合は通貨「C0」です。良いことは、以前のプロセスで double から string に変換されたため、string の形式がわかっていることです。

double に戻すにはどうすればよいですか。数値のみの値 double.parse または Convert.ToDouble は簡単ですが、通貨値はそうではありません。

string format = "{0:C0}";
double dollar = 1,234.00;
string dollarString = String.Format(format, doubleValue); // == "$1,234"
double newDollar = Convert.ToDouble(dollarString); // Fails

この最後の行が問題です。IFormatProvider または Culture などを使用する必要があると想定していますが、正確にはわかりません。

「フォーマット」が常に通貨であるとは限らないため、フォーマットが通貨であると具体的に言及することはできません。

アイデア?

4

2 に答える 2

1

これを書いているうちに、次のことを思いつきました。これが良い方法であるかどうか、または後で問題が発生する可能性があるかどうかについてのさらなるフィードバック。

double newDollar;
double.TryParse(dollarString, NumberStyles.Any, CultureInfo.CurrentCulture.NumberFormat, out newDollar);
于 2013-06-26T21:21:04.330 に答える
0

を使用している場合はCultureInfo.CurrentCulture、必ずスレッドの CurrentCulture を設定してください

そうしないと、間違った方法で解析される可能性があります (コンピューターの言語設定によって異なります)。

 Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); 

次に、これを安全に使用できます。

double.TryParse(dollarString, NumberStyles.Any, 
CultureInfo.CurrentCulture.NumberFormat, out newDollar);

または、次のような関数を作成することもできます (カルチャを設定せずに適切な形式を取得するには)。

補足:スイスでは、ユーロがまだ解析できるため、これが問題を引き起こす可能性があります。したがって、5,05 (€) は 505 (CHF) に正常に解析されます。私を信じてください、あなたはこれが起こることを望んでいません。

public static double GetDouble(string value, double defaultValue)
{
    double numberToConvert;

    if (!double.TryParse(value, System.Globalization.NumberStyles.Any, 
CultureInfo.CurrentCulture, out numberToConvert) &&
        !double.TryParse(value, System.Globalization.NumberStyles.Any,
CultureInfo.GetCultureInfo("en-US"), out numberToConvert) &&
        !double.TryParse(value, System.Globalization.NumberStyles.Any,
CultureInfo.InvariantCulture, out numberToConvert))
    {
        numberToConvert= defaultValue;
    }

    return numberToConvert;
}
于 2013-06-26T21:33:28.600 に答える