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

Converter doesn't convert culture number format?

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

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

        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 不是双精度的有效值”。我试着给函数一个 culture 参数来查看是否是问题所在,但这也不起作用(我为 TypeDescriptorContext 传递了 null)。

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

仍然抛出相同的异常。我还尝试了使用显式设置的组和小数分隔符的自定义区域性,但仍然是同样的问题。

也许这甚至不是文化,而是转换器不喜欢价值的其他因素。

有谁知道这可能是什么原因造成的?即使字符串通过显式 double.TryParse 调用转换得很好。

你可以这样试试:

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

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

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