带有前导零的int.Parse()

时间:2009-11-05 00:00:18

标签: c# .net

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

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

8 个答案:

答案 0 :(得分:19)

您的代码为我运行,没有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发布的帖子。看看症状是否与你的相符。

  

供参考,这是我们发现的。   受影响的机器有坏数据   注册表值   [HKEY_CURRENT_USER \控制面板   \国际\] sPositiveSign。   通常,此值为空   REG_SZ(以null结尾的字符串)。在   这种情况下,字符串缺少它   终止。这混淆了API   函数GetLocaleInfoW(),导致它   认为'0'(ASCII数字为零)   是当前的积极信号   locale(通常应为'+')。   这造成了各种各样的破坏。

     

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

     

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

     

这是Windows本地化的一个错误   API,而不是类库。注册   需要检查一个值   终止。他们正在看着它。

...和here's a report on Microsoft Connect关于此问题:

答案 1 :(得分:7)

尝试

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

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

  

转换字符串表示形式   一个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);
      }

}

答案 4 :(得分:1)

尝试

int i = Convert.ToInt32(value);

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

答案 5 :(得分:1)

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

要100%确定我已经尝试了您的代码,并且在将parse更正为Parse后,它运行正常并且不会抛出任何异常。

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:1)

对于十进制数字:

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

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

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