TryParse等同于具有不变文化的转换

问题描述 投票:7回答:3

在我的代码中,我经常使用以下转换:

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);
c# culture tryparse
3个回答
7
投票

您可以在NumberStyles中阅读有关documentation的信息。从本质上讲,它允许您指定要解析的文本类型。

如果您想尽可能地灵活,那么NumberStyles.Any是“最大”选项。

[Convert.ToInt32等同于使用int.ParseConvert.ToDecimal等同于使用decimal.Parse-它们委托给这些方法。

根据documentationint.Parse,默认值为NumberStyles.Integer。并且对于documentationdecimal.Parse,默认值为NumberStyles.Number。如果要与Convert.ToInt32Convert.ToDecimal的行为保持一致,则应使用这些值。


4
投票

documentation for Int64.TryParse表示NumberStyles.Integer是默认值:

s参数使用NumberStyles.Integer样式进行解释。除了十进制数字外,仅允许前导和尾随空格以及前导符号。

对于Decimal.TryParse,它是NumberStyles.Number

参数s使用NumberStyles.Number样式进行解释。这意味着允许使用空格和数千个分隔符,但不允许使用货币符号。


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

[我也要指出,如果Int64.TryParse足够,那么您应该呼叫Convert.ToInt32,所以应该叫Int32.TryParse

© www.soinside.com 2019 - 2024. All rights reserved.