C# 解析来自不同语言环境的 int

mon*_*nty 2 c# .net-core

我知道,还有其他类似的问题,例如将数字转换为特定于文化的

但是我遇到了困难,即使答案对我也不起作用。仍然得到 System.FormatException: '输入字符串的格式不正确。'

我的当前/系统语言环境是 de,我正在解析一个 en int。到目前为止,无论我尝试过什么(包括之前问题的答案,都不起作用。

那么,我错过了什么?


            string numberStr = "1,111"; // one thousand one hundred eleven

            //int result = int.Parse(numberStr);
            //int result = int.Parse(numberStr, CultureInfo.GetCultureInfo("en-US").NumberFormat);
            //int result = int.Parse(numberStr, CultureInfo.InvariantCulture);
            //int result = int.Parse(numberStr, CultureInfo.InvariantCulture.NumberFormat);
            //int result = int.Parse(numberStr, CultureInfo.GetCultureInfo("en-UK").NumberFormat);
            int result = int.Parse(numberStr, CultureInfo.GetCultureInfo("en"));

            Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

can*_*on7 8

您的问题很简单,int.Parse(string)并且int.Parse(string, IFormatProvider)不允许使用千位分隔符。

您可以在文档的备注部分看到这一点:

s参数包含多个形式:

[ws][符号]数字[ws]

但是,您可以使用int.Parse(string, NumberStyles), 重载,它允许您指定NumberStyles.

如果我们查看的源代码int.Parse(string),我们可以看到它有效地调用了int.Parse(string, NumberStyles.Integer).

如果您查看 文档NumberStyles,我们想要Integer,而且AllowThousands. 我们不想深入到Number,因为这包括AllowDecimalPoint,并且整数不能有小数点。

int result = int.Parse("1,111", NumberStyles.Integer | NumberStyles.AllowThousands);
Run Code Online (Sandbox Code Playgroud)

你可能需要指定一个文化,因为千位分隔符(如德国的用途取决于文化.作为千位分隔符)。不变文化使用,,正如en

int result = int.Parse(
    "1,111", 
    NumberStyles.Integer | NumberStyles.AllowThousands,
    CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)


ger*_*rmi 5

如果您允许千位分隔符,它将起作用:

int.Parse("1,111", NumberStyles.AllowThousands, CultureInfo.GetCultureInfo("en"));
// 1111
Run Code Online (Sandbox Code Playgroud)