带有前导零的int.Parse()

如何防止下面的代码抛出FormatException 。 我希望能够将前导零的字符串解析为整数。 有干净的方法吗?

 string value = "01"; int i = int.Parse(value); 

你的代码为我运行,没有FormatException (一旦你正确地利用了方法):

 string value = "01"; int i = int.Parse(value); 

但这确实敲响了一个老钟; 我多年前遇到的一个问题,微软认为这是一个针对Windows(不是.NET)本地化组件的错误。 要测试您是否看到这个,请运行此代码并告诉我们您是否收到FormatException:

 string value = "0"; // just a zero int i = int.Parse(value); 

编辑 :这是我在2007年从Usenet发布的post。看看症状是否与你的相符。

作为参考,这是我们发现的。 受影响的计算机的注册表值[HKEY_CURRENT_USER \ Control Panel \ International \ sPositiveSign]的数据不正确。 通常,此值为空REG_SZ(以null结尾的字符串)。 在这种情况下,字符串缺少其终结符。 这混淆了API函数GetLocaleInfoW(),导致它认为’0’(ASCII数字为零)是当前语言环境的正号(通常应为’+’)。 这造成了各种各样的破坏。

您可以使用regedit.exe自行validation:通过右键单击该值并选择“修改二进制数据”来打开该值。 您应该在右侧看到两个点(表示空终止符)。 如果你看不到任何点,你就会受到影响。 通过添加终结符(四个零)来修复它。

您还可以检查CultureInfo.CurrentCulture.NumberFormat.PositiveSign的值; 它应该是’+’。

这是Windows本地化API中的错误,而不是类库。 需要检查reg值以获得终结符。 他们正在看着它。

…以下是有关此问题的Microsoft Connect报告 :

尝试

 int i = Int32.Parse(value, NumberStyles.Any); 

TryParse允许您在不抛出exception的情况下确认解析的结果。 引用MSDN

将数字的字符串表示forms转换为其等效的32位有符号整数。 返回值表示操作是否成功。

用他们的例子

  private static void TryToParse(string value) { int number; bool result = Int32.TryParse(value, out number); if (result) { Console.WriteLine("Converted '{0}' to {1}.", value, number); } else { if (value == null) value = ""; Console.WriteLine("Attempted conversion of '{0}' failed.", value); } 

}

 int i = int.parse(value.TrimStart('0')); 

你根本不需要做任何事情。 添加前导零不会导致FormatException。

为了100%肯定我尝试了你的代码,并在纠正parseParse它运行得很好并且不会抛出任何exception。

显然你没有显示你正在使用的实际代码,所以不可能说出问题出在哪里,但对于处理前导零的Parse方法来说绝对不是问题。

尝试

int i = Convert.ToInt32(value);

编辑 :嗯。 正如所指出的,它只是包装Int32.Parse。 不知道为什么你得到FormatException。

我有以下可能有用的代码:

 int i = int.Parse(value.Trim().Length > 1 ? value.TrimStart(new char[] {'0'}) : value.Trim()); 

这将削减所有额外的前导0并避免只有一个0的情况。

对于十进制数:

 Convert.ToInt32("01", 10); // 1 

对于16位数字,前导零是常见的:

 Convert.ToInt32("00000000ff", 16); // 255