2010-03-08 49 views
2

我想打一个通用的字符串,数字转换器,并提供其作为字符串的扩展,所以我写了下面的代码:如何使用Convert.ChangeType将字符串转换为具有组分隔符的数字?

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(在不变式文化中)。但是,该功能崩溃!

当试图执行非通用转换,如double.Parse(...),我可以使用接受NumberStyles参数的重载。我指定NumberStyles.Number,这次它的工作!

所以,问题是:

  • 为什么解析不尊重我的NumberFormatInfo(其中我在操作系统中指定的NumberGroupSeparator被明确指定为空格)
  • 我怎么可能让工作具有Convert.ChangeTime的通用版本,因为它没有重载,它接受一个NumberStyles参数?

回答

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阙CA马尔凯COMME CA? :)

+0

我尝试了几种文化,这是同样的事情:有效的组分隔符的存在引发FormatException;尽管它适用于其他事情(小数点分隔符,日期和时间分隔符)。对于千位分隔符,您必须指定一个NumberStyles.AllowThousands值。但正如我之前所说,Convert.ChangeType没有这种参数的重载。 – Loic 2010-03-08 12:37:10

+0

它适用于双打,但尝试整数:它会失败! 以下代码抛出格式异常: VAR I =(int)的Convert.ChangeType( “1 234” 的typeof(INT),新的培养物( “FR-FR”); 下面的代码工作: 变种d =(double)Convert.ChangeType(“1 234”,typeof(double),new Culture(“fr-FR”); – Loic 2010-03-10 13:27:37

+0

@Loic:你是对的,也许Convert.ChangeType没有在其实现中指定NumberStyles.AllowThousands 。关于它我们没有太多可以做的,恐怕你必须自己处理它,而不使用Convert.ChangeType。 – 2010-03-10 14:05:00

相关问题