Hen*_*son 11 .net c# 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
Run Code Online (Sandbox Code Playgroud)
使用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;
}
Run Code Online (Sandbox Code Playgroud)
更新
我偶然发现了这个链接,这是微软连接数据库中的一个错误:
似乎有类似症状的问题,但没有真正的根本原因.如果有人能详细说明,我将不胜感激!
Joã*_*elo 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);
Run Code Online (Sandbox Code Playgroud)
这将输出:
// 8
// 3
Run Code Online (Sandbox Code Playgroud)
您可以通过使用Parse接受NumberStyles枚举的重载明确说明您正在解析整数而不是货币.
Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE"));
Run Code Online (Sandbox Code Playgroud)
这一次,因为您指定要解析整数,所以不会发生错误.
但是,IIRC 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
Run Code Online (Sandbox Code Playgroud)
询问用户是否有连接问题中指示的区域设置注册表设置,并检查它们是否符合您的预期.
附注:欢迎使用SO,顺便说一下,当您需要在问题中添加更多信息时,您应该对其进行编辑,而不是在答案中提供.