【问题标题】:TryParse equivalent of Convert with invariantcultureTryParse 等效于 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);

【问题讨论】:

  • 你的做法是正确的

标签: c# culture tryparse


【解决方案1】:

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

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

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

根据int.Parsedocumentation,默认为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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2012-11-16
  • 2012-11-07
相关资源
最近更新 更多