我需要将字符串转换回double,但字符串并不总是相同的格式。在一种情况下,它是“N0”,在另一种情况下是“#,##”,而另一种情况是货币“C0”。好消息是,我知道字符串的格式是在它从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或其他东西,但我不确定。
我不能具体引用格式是货币,因为“格式”并不总是货币。
想法?
答案 0 :(得分:1)
当我打字时,我想出了以下内容。进一步反馈这是否是一种很好的方式,或者我可能会在以后遇到问题。
double newDollar;
double.TryParse(dollarString, NumberStyles.Any, CultureInfo.CurrentCulture.NumberFormat, out newDollar);
答案 1 :(得分: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;
}