【问题标题】:How to convert culture specific double using TypeConverter?如何使用 TypeConverter 转换特定于文化的双精度?
【发布时间】:2010-04-23 20:55:39
【问题描述】:

TypeConverter 类有问题。它适用于 CultureInvariant 值,但不能转换特定的文化,如英语千位分隔符。下面是一个我无法工作的小测试程序。

这就是问题所在 :) - ConvertFromString 抛出异常并显示以下消息 “2,999.95 不是 Double 的有效值。” 以及内部异常 “输入字符串不是格式正确。”

using System;
using System.Globalization;
using System.ComponentModel;

class Program
{
    static void Main()
    {
        try
        {
            var culture = new CultureInfo("en");
            var typeConverter = TypeDescriptor.GetConverter(typeof(double));
            double value = (double)typeConverter.ConvertFromString(
                null, 
                culture, 
                "2,999.95");

            Console.WriteLine("Value: " + value);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
        }
    }
}

编辑: 链接到Connect上的错误报告

【问题讨论】:

  • 什么不起作用?你遇到了什么错误?
  • ConvertFromString 抛出异常:“2,999.95 不是 Double 的有效值。”

标签: c# .net cultureinfo


【解决方案1】:

TypeDescriptor.GetConverter(typeof(double)) 获得的DoubleConverter 最终使用以下参数调用Double.Parse

Double.Parse(
    "2,999.95", 
    NumberStyles.Float, 
    (IFormatProvider)culture.GetFormat(typeof(NumberFormatInfo)));

问题是NumberStyles.Float 不允许使用千位分隔符,这就是您遇到问题的原因。您可以在Microsoft Connect 上提交此内容,或者查看其他人是否有同样的问题。

如果Double.Parse 也与NumberStyles.AllowThousands 一起调用,则不会出现问题。

Double.Parse(
    "2,999.95", 
    NumberStyles.Float | NumberStyles.AllowThousands, 
    (IFormatProvider)culture.GetFormat(typeof(NumberFormatInfo)));

【讨论】:

  • 但该示例与使用不带任何 NumberStyles 的 Double.Parse 更密切相关,在这种情况下 Double.Parse 将起作用。刚刚将其作为 Connect 上的错误提交。感谢您的反馈。
  • @Christian,如果您不介意,您能否更新您的问题并将链接添加到 Connect 问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多