我想将一个通用字符串转换为数字转换器,并将其作为字符串扩展名提供,因此我编写了以下代码:
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,这次它有效!
所以,问题是:
答案 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? :)