1

我需要将字符串转换回双精度,但字符串并不总是相同的格式。在一种情况下是“N0”,在另一种情况下是“#,##”,还有一种是货币“C0”。好消息是,我知道字符串在从双精度转换为字符串的过程中的早期格式。

我怎样才能转换回双倍。只有数字值 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 回答