在我的代码中,我经常使用以下转换:
Convert.ToInt32(value, Cultureinfo.InvariantCulture);
Convert.ToDecimal(value, CultureInfo.InvariantCulture);
由于最近的错误,我现在喜欢使用TryParse函数。我不确定我是否正确使用以下等效项,因为我不完全理解NumberStyles枚举。
Int64.TryParse(value, NumberStyles.Any, CultureInfo.invariantCulture, out output);
Decimal.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out output);
答案后下方编辑
下面的代码应该是正确的替代方法:
Int64.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out output);
Decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out output);
您可以在NumberStyles
中阅读有关documentation的信息。从本质上讲,它允许您指定要解析的文本类型。
如果您想尽可能地灵活,那么NumberStyles.Any
是“最大”选项。
[Convert.ToInt32
等同于使用int.Parse
,Convert.ToDecimal
等同于使用decimal.Parse
-它们委托给这些方法。
根据documentation的int.Parse
,默认值为NumberStyles.Integer
。并且对于documentation的decimal.Parse
,默认值为NumberStyles.Number
。如果要与Convert.ToInt32
和Convert.ToDecimal
的行为保持一致,则应使用这些值。
documentation for Int64.TryParse表示NumberStyles.Integer
是默认值:
s参数使用NumberStyles.Integer样式进行解释。除了十进制数字外,仅允许前导和尾随空格以及前导符号。
对于Decimal.TryParse,它是NumberStyles.Number
:
参数s使用NumberStyles.Number样式进行解释。这意味着允许使用空格和数千个分隔符,但不允许使用货币符号。
是的,您的方法是正确的,两种方法应该给出相同的结果。
Convert.ToInt32(string s)
的实现如下:
public static int ToInt32(String value, IFormatProvider provider)
{
if (value == null)
return 0;
return Int32.Parse(value, NumberStyles.Integer, provider);
}
因此您可以在内部看到一种方法调用另一种方法-唯一的区别是Convert
不能控制数字样式-它被硬编码为NumberStyles.Integer
。如果要使用相同的功能,则应在调用TryParse
时指定此枚举值。
Convert
类的源代码可用here。
[我也要指出,如果Int64.TryParse
足够,那么您应该呼叫Convert.ToInt32
,所以应该叫Int32.TryParse
。