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.ParseConvert.ToDecimal 等价于使用decimal.Parse - 它们委托给这些方法。

根据int.Parse 的documentation,默认为NumberStyles.Integer。对于decimal.Parse,根据documentation,默认为NumberStyles.Number。如果要与Convert.ToInt32Convert.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 - 哪个更快更安全?

C#中(int)int.Parse()int.TryParse()和Convert.ToInt32()的区别

int.TryParse语法糖

C#类型转换