【问题标题】:Converter doesn't convert culture number format?转换器不转换文化数字格式?
【发布时间】:2016-01-08 07:39:25
【问题描述】:

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

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

这仍然引发了同样的异常。我还尝试了使用明确设置组和小数分隔符的自定义文化,但仍然是同样的问题。

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

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

【问题讨论】:

    标签: c# .net double typeconverter


    【解决方案1】:

    你可以这样试试:

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

    【讨论】:

    • 如何使用泛型类型函数做到这一点?我想制作一个转换任何类型的函数(我只需要数字类型,但我不记得只允许 使用数字类型的限制)。
    • 我将其更改为 Convert,ChangeType 并将其集成到我的通用函数中并且它起作用了。
    【解决方案2】:

    如果TryParse 方法使用“方法重载”,则转换失败的默认值将是您的情况下的目标类型指示符
    为您要转换的每种类型创建自己的转换方法

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

    【讨论】:

    • 这就是我想要避免的:每种类型都有一个方法。
    • 没问题,我更喜欢每种类型都有自己的方法,因为可维护性和在某些情况下更好的性能。在幕后,您已经为每种类型都有自己的转换方法,您尝试通过另一种通用方法执行该方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多