TryParse 等效于 Convert with invariantculture
Posted
技术标签:
【中文标题】TryParse 等效于 Convert with invariantculture【英文标题】:TryParse equivalent of Convert with invariantculture 【发布时间】:2015-05-22 10:24:03 【问题描述】:在我的代码中,我经常使用以下转换:
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);
【问题讨论】:
你的做法是正确的 【参考方案1】:您可以在documentation 中阅读有关NumberStyles
的信息。本质上,它允许您指定要解析的文本类型。
如果您想尽可能灵活,那么NumberStyles.Any
是“最广泛”的选项。
Convert.ToInt32
等价于使用int.Parse
,Convert.ToDecimal
等价于使用decimal.Parse
- 它们委托给这些方法。
根据int.Parse
的documentation,默认为NumberStyles.Integer
。对于decimal.Parse
,根据documentation,默认为NumberStyles.Number
。如果要与Convert.ToInt32
和Convert.ToDecimal
的行为保持一致,则应使用这些值。
【讨论】:
NumberStyles.Any | NumberStyles.AllowHexSpecifier
不会是比 NumberStyles.Any
更广泛的选择,还是这种组合是非法的?
我用你和 dcastro 的回答 tyvm 改变了问题
@stakx 这似乎是非法的。文档说可以与 AllowHexSpecifier 组合的唯一标志是 AllowLeadingWhite 和 AllowTrailingWhite。。我试过了,结果是例外。【参考方案2】:
documentation for Int64.TryParse 表示NumberStyles.Integer
是默认值:
使用 NumberStyles.Integer 样式解释 s 参数。除十进制数字外,仅允许前导和尾随空格以及前导符号。
对于Decimal.TryParse,它是NumberStyles.Number
:
参数 s 使用 NumberStyles.Number 样式解释。这意味着允许使用空格和千位分隔符,但不允许使用货币符号。
【讨论】:
这与decimal
明确不对应,decimal
可以具有浮动值。考虑到问题中的两个用例,NumberStyles.Float
会更合适(或者只是一般NumberStyles.Number)
。
我用你和 charles mager 的回答 tyvm 改变了问题【参考方案3】:
是的,您的方法是正确的,两种方法应该给出相同的结果。
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 可用。
我还要指出,如果Convert.ToInt32
足够,那么您正在调用Int64.TryParse
,那么Int32.TryParse
也应该如此。
【讨论】:
我没有投反对票,但我有两个建议:1. 引用您的来源! (您是如何实现Convert.ToInt32
的?)2. 您的回答表明NumberStyles.Integer
将是首选;但您最初说 OP 的当前代码是等效的(他们使用 NumberStyles.Any
)。也许你可以更多地进入NumberStyles.Any
。
我反映到mscorlib
- 无需引用:)
其实你应该这么说。除了可能的法律问题(但 IANAL)之外,对装配进行逆向工程会产生随时可能发生变化的知识。我想说,在回答 SO 时,应该更喜欢参考源(名字说明了一切)而不是反编译。不过,这只是我的看法。
我添加了指向 MS 参考源的链接。
我用 dcastro 和 charles mager 的回答更改了问题,您的回答对我了解更多 Convert.ToInt 方法非常有帮助 +1以上是关于TryParse 等效于 Convert with invariantculture的主要内容,如果未能解决你的问题,请参考以下文章
int.Parse()int.TryParse()和Convert.ToInt32()的区别
decimal.TryParse和Convert.ToDecimal+try{} catch{}的性能比较
Double.TryParse 或 Convert.ToDouble - 哪个更快更安全?