将字符串转换为已知格式的双精度

本文关键字:格式 双精度 字符串 转换 | 更新日期: 2023-09-27 18:19:59

我需要将字符串转换回双精度,但字符串的格式并不总是相同的。在一种情况下是"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之类的东西,但我不太确定。

我不能特别提到格式是一种货币,因为"格式"并不总是一种货币。

想法?

将字符串转换为已知格式的双精度

当我输入这个时,我想到了以下内容。进一步反馈这是否是一种好的方法,或者我以后是否会遇到问题。

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

如果使用CultureInfo.CurrentCulture,请确保设置线程的CurrentCulture

否则,它可能会以错误的方式解析(取决于计算机上的语言设置)。

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

然后你可以安全地使用这个:

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

或者,您可以创建这样的函数(在不设置区域性的情况下获得正确的格式)。

附带说明:在瑞士,这可能会引起麻烦,因为欧元仍然可以解析。因此,5,05(€)将被成功解析为505(瑞士法郎)。相信我,你不希望发生这种事。

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