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参数?
我尝试了几种文化,这是同样的事情:有效的组分隔符的存在引发FormatException;尽管它适用于其他事情(小数点分隔符,日期和时间分隔符)。对于千位分隔符,您必须指定一个NumberStyles.AllowThousands值。但正如我之前所说,Convert.ChangeType没有这种参数的重载。 – Loic 2010-03-08 12:37:10
它适用于双打,但尝试整数:它会失败! 以下代码抛出格式异常: 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
@Loic:你是对的,也许Convert.ChangeType没有在其实现中指定NumberStyles.AllowThousands 。关于它我们没有太多可以做的,恐怕你必须自己处理它,而不使用Convert.ChangeType。 – 2010-03-10 14:05:00