转换器不转换文化数字格式?

时间:2016-01-08 07:39:25

标签: c# .net double typeconverter

我的C#程序中有一个字符串编号,它是“6.967.015”。这是德国数字格式“。”分开1000组,“,”是小数分隔符。

我创建了一个使用Double.TryParse将文本转换为double值的函数。它工作正常:

        if (Double.TryParse(text, out result))
        {
            return result;
        }
        else
        {
            return defaultValue;
        }

现在我需要第二种类型可转换而不是复制函数,我想创建一个接受类型的函数(不要介意Type参数而不是泛型<T>函数,它是为了完整性原因)。

    public static object DefaultIfNotValid(this object value, Type type, object defaultValue)
    {
        var converter = TypeDescriptor.GetConverter(type);
        object convertedValue;

        if (converter != null)
        {
            try
            {
                convertedValue = converter.ConvertFrom(value);
                return convertedValue;
            }
            catch (Exception)
            {
                return defaultValue;
            }
        }

        return defaultValue;
    }

此代码的问题在于它适用于“123”,但它不适用于上述数字“6.967.015”。 Convert函数抛出“6.967.015不是double的有效值”。我尝试给函数一个culture参数,看看是不是问题,但是这也没有用(我为TypeDescriptorContext传递了null)。

converter.ConvertFrom(null, new CultureInfo("de-de"), value);

仍然抛出同样的例外。我还尝试了一个明确设置组和小数分隔符的自定义文化,但仍然是同样的问题。

也许它甚至不是文化,而是转换器不喜欢价值的其他东西。

有谁知道这可能是什么原因?即使字符串使用显式的double.TryParse调用也可以很好地转换。

2 个答案:

答案 0 :(得分:4)

您可以尝试这样:

var nf = new NumberFormatInfo{NumberDecimalSeparator = ",", NumberGroupSeparator = "."};
var convertedValue = Convert.ToDouble(value, nf);

答案 1 :(得分:0)

如果TryParse方法有效,请使用&#34;方法重载&#34;,失败转换的默认值将是您案例中的目标类型指示符
为您要转换的每种类型创建自己的转换方法

public static double DefaultIfNotValid(this string value, double defaultValue)
{
    double temp = 0;
    if (double.TryParse(value, out temp) == true)
        return temp;
    return defaultValue;
}

public static int DefaultIfNotValid(this string value, int defaultValue)
{
    int temp = 0;
    if (int.TryParse(value, out temp) == true)
        return temp;
    return defaultValue;
}

然后使用似乎不那么痛苦

string rawValue = "6.967.015";
double defaultValue = 9.9;
double parsedValue = rawValue.DefaultIfNotValid(defaultValue);