2013-06-26 63 views
1

我需要将字符串转换回double,但字符串并不总是相同的格式。在一种情况下,它是“N0”,在另一个“#,##”中,另一种是货币“C0”。好的是,我知道该字符串的格式与之前的过程相同,它已经从double转换为string。将字符串转换为已知格式的双精度值

我怎样才能转换回双。数字只是简单地赋值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或文化或什么的,但我不完全确定。

我不能具体引用格式是货币,因为“格式”并不总是货币。

想法?

回答

1

当我打字时,我想出了以下内容。关于这是否是一种好的做法或者如果我以后可能遇到问题的进一步反馈。

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

您也可以传入'TryParseExact'并传递格式化字符串,您知道它将匹配。 (如果可以是多个选项之一,则还可以传入一组字符串) –

+0

注意:如果计算机语言设置不同,则CurrentCulture最终可能会以错误的方式解析它。 例如在瑞士,货币分隔符是一个点(。),而在德国是逗号(,)。 –

+1

@ScottChamberlain在.NET中没有像TryParseExact这样的函数。 –

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; 
}