1

我有一个字符串值的传入源,它用“。”表示双值。和“,”分隔符和我的程序将在具有不同分隔符设置(“,”或“,”)的PC上运行
我可以用单行转换它而不尝试先转换“。”,然后如果失败,请尝试“, “?
我尝试了一些这样的组合:

    string dot_val = "1.12";
    string non_dot_val = "1,12";

    double dot_double = 0, non_dot_double = 0;

    bool dot_res = double.TryParse(dot_val, NumberStyles.Any, CultureInfo.CurrentCulture, out dot_double);
    bool non_dot_res = double.TryParse(non_dot_val, NumberStyles.Number | NumberStyles.AllowCurrencySymbol, CultureInfo.CurrentCulture, out non_dot_double);

但是转换的尝试之一总是失败。
如果很快告诉它,我需要一个通用函数来转换“。” 或 "," 将双精度值分隔为双精度

4

2 回答 2

2

好吧,当前的文化告诉您是否.,小数分隔符。如果您希望您的函数解析这两种格式,则需要传入具有相应分隔符的区域性。在您的示例中:

public double UniveralParse(string value)
{
    double result;

    // If we can not parse the "." format...
    if (!double.TryParse(value, NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result))
        // And also can not parse the "," format...
        if (!double.TryParse(value, NumberStyles.Any, CultureInfo.GetCultureInfo("de-DE"), out result))
            // we throw an exception
            throw new ArgumentException("value is not in expected format!");

    // Otherwise we can return the value
    return result;
}
于 2013-02-07T09:38:29.963 回答
1

最简单的方法是将 ',' 替换为 '.' 并使用不变的文化设置解析结果:

double.TryParse(
          dot_val.Replace(',','.'), 
          NumberStyles.Any, 
          CultureInfo.InvariantCulture, 
          out dot_double);

唯一的限制是你不应该在你的号码中分组(比如 123,000.45)

于 2013-02-07T09:39:39.400 回答