【问题标题】:Convert String to Double with Known Format使用已知格式将字符串转换为双精度
【发布时间】:2013-06-24 05:14:36
【问题描述】:

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

我无法具体提及格式是货币,因为“格式”并不总是货币。

想法?

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果您使用的是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;
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您也可以传入TryParseExact 并传入您知道它将匹配的格式字符串。 (如果可以是多个选项之一,您也可以传入一个字符串数组)
      • 注意:如果计算机语言设置不同,CurrentCulture 最终可能会以错误的方式解析它。例如。在瑞士,货币的分隔符是一个点 (.),而在德国,它是一个逗号 (,)。
      • @ScottChamberlain 在 .NET 中没有像 TryParseExact 这样的功能。
      • @FabianBigler 真该死,没有!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多