转换器不转换文化数字格式?
Converter doesn't convert culture number format?
我的 C# 程序中有一个字符串编号,它是“6.967.015”。这是德语数字格式,其中“。”分隔 1000 组,"," 是小数点分隔符。
我创建了一个使用 Double.TryParse 将文本转换为双精度值的函数。它工作正常:
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 不是双精度的有效值”。我试着给函数一个 culture 参数来查看是否是问题所在,但这也不起作用(我为 TypeDescriptorContext 传递了 null)。
converter.ConvertFrom(null, new CultureInfo("de-de"), value);
仍然抛出相同的异常。我还尝试了使用显式设置的组和小数分隔符的自定义区域性,但仍然是同样的问题。
也许这甚至不是文化,而是转换器不喜欢价值的其他因素。
有谁知道这可能是什么原因造成的?即使字符串通过显式 double.TryParse 调用转换得很好。
你可以这样试试:
var nf = new NumberFormatInfo{NumberDecimalSeparator = ",", NumberGroupSeparator = "."};
var convertedValue = Convert.ToDouble(value, nf);
如果 TryParse
方法有效,请使用 "method overload",在您的案例中,转换失败的默认值将是目标类型指示符
为您要转换的每种类型创建自己的转换方法
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);
我的 C# 程序中有一个字符串编号,它是“6.967.015”。这是德语数字格式,其中“。”分隔 1000 组,"," 是小数点分隔符。
我创建了一个使用 Double.TryParse 将文本转换为双精度值的函数。它工作正常:
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 不是双精度的有效值”。我试着给函数一个 culture 参数来查看是否是问题所在,但这也不起作用(我为 TypeDescriptorContext 传递了 null)。
converter.ConvertFrom(null, new CultureInfo("de-de"), value);
仍然抛出相同的异常。我还尝试了使用显式设置的组和小数分隔符的自定义区域性,但仍然是同样的问题。
也许这甚至不是文化,而是转换器不喜欢价值的其他因素。
有谁知道这可能是什么原因造成的?即使字符串通过显式 double.TryParse 调用转换得很好。
你可以这样试试:
var nf = new NumberFormatInfo{NumberDecimalSeparator = ",", NumberGroupSeparator = "."};
var convertedValue = Convert.ToDouble(value, nf);
如果 TryParse
方法有效,请使用 "method overload",在您的案例中,转换失败的默认值将是目标类型指示符
为您要转换的每种类型创建自己的转换方法
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);