C# “的内部解析”;8“;失败。int.Parse始终需要CultureInfo.InvariantCulture?

C# “的内部解析”;8“;失败。int.Parse始终需要CultureInfo.InvariantCulture?,c#,.net,parsing,cultureinfo,currentculture,C#,.net,Parsing,Cultureinfo,Currentculture,我们开发了一个已建立的软件,该软件在除一台计算机外的所有已知计算机上都能正常工作。问题是解析以“8”开头的字符串字符串开头的“8”似乎是保留字符。 Parsing: int.Parse("8") -> Exception message: Input string was not in a correct format. int.Parse("80") -> 0 int.Parse("88") -> 8 int.Parse("8100") -> 100 Current

我们开发了一个已建立的软件,该软件在除一台计算机外的所有已知计算机上都能正常工作。问题是解析以“8”开头的字符串字符串开头的“8”似乎是保留字符。

Parsing:
int.Parse("8") -> Exception message: Input string was not in a correct format. 
int.Parse("80") -> 0
int.Parse("88") -> 8
int.Parse("8100") -> 100

CurrentCulture: sv-SE 
CurrentUICulture: en-US
使用int.Parse(“8”,CultureInfo.InvariantCulture)解决了这个问题。然而,如果能知道问题的根源就好了

问题:如果不指定不变的区域性,为什么会出现这种行为“8”


其他信息:

我确实向我的客户发送了一个小程序,以实现上述结果:

    private int ParseInt(string s)
    {
        int parsedInt = -1000;
        try
        {
            parsedInt = int.Parse(s);

            textBoxMessage.Text = "Success: " + parsedInt;

        }
        catch (Exception ex)
        {
            textBoxMessage.Text =
                string.Format("Error parsing string: '{0}'", s) + Environment.NewLine +
                "Exception message: " + ex.Message;
        }

        textBoxMessage.Text += Environment.NewLine + Environment.NewLine +
            "CurrentCulture: " + Thread.CurrentThread.CurrentCulture.Name + "\r\n" +
            "CurrentUICulture: " + Thread.CurrentThread.CurrentUICulture.Name + "\r\n";
        return parsedInt;
    }

更新

我偶然发现了这个链接,microsoft connect数据库中的一个错误:


似乎有类似症状的问题,但没有真正的根本原因。如果有人能详细说明这一点,我将不胜感激

对于
sv-SE
区域性
8
表示
CurrencyNegativePattern
,这就是您得到所描述错误的原因

您可以通过运行以下示例来检查这一点:

var ci = new CultureInfo("sv-SE");

var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo));

Console.WriteLine(nfi.CurrencyNegativePattern);
Console.WriteLine(nfi.CurrencyPositivePattern);
这将输出:

// 8
// 3
通过使用接受
NumberStyles
枚举的
Parse
重载,可以明确地说您正在解析整数而不是货币

Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE"));
这一次,由于您指定要分析整数,因此不会发生错误


但是,IIRC the
Int32.Parse
默认情况下应该将输入解释为整数,因此我无法理解为什么您会在该示例代码中出现错误


更新:

从您最近添加的信息来看,您似乎应该确保问题不是外部的。也就是说,例如,如果用户将windows区域设置的正号设置更改为
8
,则获得所获得的错误将是正常的,并且对您来说非常有意义。这就像将
+
设置为正号,然后尝试解析它:

var ci = new CultureInfo("sv-SE");
var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo));

nfi.PositiveSign = "+";

Int32.Parse("+", nfi); // This will throw
要求用户提供连接问题中指示的区域设置注册表设置,并检查它们是否符合您的预期


旁注:欢迎来到SO,顺便说一句,下次您需要在问题中添加更多信息时,您应该编辑它,而不是在回答中提供它。

谢谢旁注,我处理好了:)我之前检查了注册表中的值,查看他的语言环境设置,唯一的8个是CurrencyNegativePattern,它不能帮助我在机器上重现错误。你在这里绝对是对的,乔。然而,这个问题很难解决,我也不确定微软是否知道问题的原因。你肯定会大发雷霆,但这种行为仍然是个谜。这就是为什么我不接受你的答案作为解决方案,尽管我很感谢你的努力!这个答案的开头在我看来是错误的。
NumberFormatInfo.CurrencyNegativePattern
NumberFormatInfo.CurrencyPositivePattern
中的值仅用作键-用于标识负号(-)、货币符号的顺序以及将用于格式化/解析的数字本身。例如,'8'作为
CurrencyNegativePattern
的值意味着模式应该是'-n$'。