int.Parse为“8”失败。 int.Parse总是需要CultureInfo.InvariantCulture?

时间:2010-04-27 09:26:05

标签: 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

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

更新

我偶然发现了这个链接,这是微软连接数据库中的一个错误:

https://connect.microsoft.com/VisualStudio/feedback/details/253265/int32-parse-fails-to-convert-the-string-0-zero-on-some-systems

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

1 个答案:

答案 0 :(得分:21)

对于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

您可以使用接受Parse枚举的NumberStyles重载明确表示您正在解析整数而不是货币。

Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE"));

这一次,因为您指定要解析整数,所以不会发生错误。


但是,Int32.Parse的{​​{1}}默认情况下应该将输入解释为整数,那么为什么你要使用该示例代码来解决错误。


<强>更新

根据您最近添加的信息,您似乎应确保问题不是外部问题。也就是说,如果用户将Windows语言环境的正号设置更改为8,那么这将是正常的,并且让您完全理解您获得的错误。这就像将+设置为正号然后尝试解析它一样:

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

nfi.PositiveSign = "+";

Int32.Parse("+", nfi); // This will throw

向用户询问连接问题中指示的区域设置注册表设置,并检查它们是否符合预期。

附注:欢迎使用SO,顺便说一下,当您需要在问题中添加更多信息时,您应该对其进行编辑,而不是在答案中提供。