我的C#程序中有一个字符串编号,它是“6.967.015”。这是德国数字格式“。”分开1000组,“,”是小数分隔符。
我创建了一个使用Double.TryParse将文本转换为double值的函数。它工作正常:
if (Double.TryParse(text, out result))
{
return result;
}
else
{
return defaultValue;
}
现在我需要第二种类型可转换而不是复制函数,我想创建一个接受类型的函数(不要介意Type参数而不是泛型<T>
函数,它是为了完整性原因)。
public static object DefaultIfNotValid(this object value, Type type, object defaultValue)
{
var converter = TypeDescriptor.GetConverter(type);
object convertedValue;
if (converter != null)
{
try
{
convertedValue = converter.ConvertFrom(value);
return convertedValue;
}
catch (Exception)
{
return defaultValue;
}
}
return defaultValue;
}
此代码的问题在于它适用于“123”,但它不适用于上述数字“6.967.015”。 Convert函数抛出“6.967.015不是double的有效值”。我尝试给函数一个culture参数,看看是不是问题,但是这也没有用(我为TypeDescriptorContext传递了null)。
converter.ConvertFrom(null, new CultureInfo("de-de"), value);
仍然抛出同样的例外。我还尝试了一个明确设置组和小数分隔符的自定义文化,但仍然是同样的问题。
也许它甚至不是文化,而是转换器不喜欢价值的其他东西。
有谁知道这可能是什么原因?即使字符串使用显式的double.TryParse调用也可以很好地转换。
答案 0 :(得分:4)
您可以尝试这样:
var nf = new NumberFormatInfo{NumberDecimalSeparator = ",", NumberGroupSeparator = "."};
var convertedValue = Convert.ToDouble(value, nf);
答案 1 :(得分:0)
如果TryParse
方法有效,请使用&#34;方法重载&#34;,失败转换的默认值将是您案例中的目标类型指示符
为您要转换的每种类型创建自己的转换方法
public static double DefaultIfNotValid(this string value, double defaultValue)
{
double temp = 0;
if (double.TryParse(value, out temp) == true)
return temp;
return defaultValue;
}
public static int DefaultIfNotValid(this string value, int defaultValue)
{
int temp = 0;
if (int.TryParse(value, out temp) == true)
return temp;
return defaultValue;
}
然后使用似乎不那么痛苦
string rawValue = "6.967.015";
double defaultValue = 9.9;
double parsedValue = rawValue.DefaultIfNotValid(defaultValue);