TryParse 等效于 Convert with invariantculture

TryParse equivalent of Convert with invariantculture

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

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);

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

The s parameter is interpreted using the NumberStyles.Integer style. In addition to the decimal digits, only leading and trailing spaces together with a leading sign are allowed.

对于 Decimal.TryParse,它是 NumberStyles.Number:

Parameter s is interpreted using the NumberStyles.Number style. This means that white space and thousands separators are allowed but currency symbols are not.

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

如果你想尽可能灵活,那么NumberStyles.Any就是'widest'选项。

Convert.ToInt32 相当于使用 int.Parse 并且 Convert.ToDecimal 相当于使用 decimal.Parse - 他们委托给这些方法。

根据 decimal.Parsedocumentation for int.Parse, the default is NumberStyles.Integer. And per the documentation,默认值为 NumberStyles.Number。如果您想与 Convert.ToInt32Convert.ToDecimal 的行为保持一致,您应该使用这些值。

是的,你的方法是正确的,两种方法应该给出相同的结果。

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 class 的源代码可用 here

我还可以指出,如果 Convert.ToInt32 足够,那么您调用 Int64.TryParse 就应该 Int32.TryParse.