如何使用Convert.ChangeType将字符串转换为带有组分隔符的数字?

时间:2010-03-08 11:04:25

标签: c# generics parsing

我想将一个通用字符串转换为数字转换器,并将其作为字符串扩展名提供,因此我编写了以下代码:

public static bool TryParse<T>( this string text, out T result, IFormatProvider formatProvider ) where T : struct
try
{
   result = (T)Convert.ChangeType( text, typeof( T ), formatProvider );
   return true;
}
catch(...

我称之为:

int value;
var ok = "123".TryParse(out value, NumberFormatInfo.CurrentInfo)

在我想使用组分隔符之前一切正常: 当我住在法国,其中千位分隔符是空格而小数分隔符是逗号时,字符串“1 234 567,89”应该等于1234567.89(在Invariant culture中)。但是,这个功能崩溃了!

尝试执行非泛型转换时,如double.Parse(...),我可以使用接受NumberStyles参数的重载。我指定NumberStyles.Number,这次它有效!

所以,问题是:

  • 为什么解析不尊重我的NumberFormatInfo(其中NumberGroupSeparator被很好地指定给空间,正如我在操作系统中指定的那样)
  • 我怎样才能使用Convert.ChangeTime来处理泛型版本,因为它没有接受NumberStyles参数的过载?

1 个答案:

答案 0 :(得分:3)

尝试明确指定文化“fr-FR”:

CultureInfo c = new CultureInfo("fr-FR");
double d = 0;
if ("1 234 567,89".TryParse<double>(out d, c)) {
    Console.WriteLine(d);
}

编辑:此示例正常运行:

static class Extension {
    public static bool TryParse<T>(this string text, out T result, IFormatProvider formatProvider) where T : struct {
        result = default(T);
        try {
            result = (T)Convert.ChangeType(text, typeof(T), formatProvider);
            return true;
        } catch {
            return false;
        }
    }

}

class Program {
    static void Main(string[] args) {
        CultureInfo c = new CultureInfo("fr-FR");
        double d = 0;
        // NumberGroupSeparator in fr-FR culture is space
        bool res = "123 456,78".TryParse<double>(out d, c);
        // Set separator as '.' and parse string with dots
        c.NumberFormat.NumberGroupSeparator = ".";
        res = "123.456,78".TryParse<double>(out d, c);
    }
}

Est-ce que ca marche comme ca? :)