代码之家  ›  专栏  ›  技术社区  ›  Taylor Leese

带前导零的int.parse()。

  •  10
  • Taylor Leese  · 技术社区  · 15 年前

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

    string value = "01";
    int i = int.Parse(value);
    
    8 回复  |  直到 7 年前
        1
  •  18
  •   Michael Petrotta user3140870    15 年前

    你的代码为我运行,没有 FormatException (正确大写方法后):

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

    但这的确敲响了一个古老的警钟;这是我多年前遇到的一个问题,微软认为这是针对Windows本地化组件(而不是.NET)的一个bug。若要测试您是否看到此情况,请运行此代码并让我们知道您是否收到格式异常:

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

    编辑 :这是我在2007年发自Usenet的帖子。看看症状是否与你的相符。

    这里是我们找到的参考资料。 受影响的机器有坏数据 注册表值 [HKEY U当前用户\控制面板 \国际\spositivesign]。 通常,该值为空 Reg_sz(以空结尾的字符串)。在 这个例子中,字符串丢失了 终结者。这混淆了API 函数getlocaleinfow(),导致 想想“0”(ASCII数字0) 是电流的积极信号吗? 区域设置(通常应为“+”)。 这造成了各种各样的破坏。

    你可以自己验证 regedit.exe:打开该注册表值的方式 右键单击该值并 选择“修改二进制数据”。你 应该看到右边的两个点 (表示空终止符)。 如果你看不到点,你就会受到影响。 通过添加终止符(4 零点)。

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

    这是Windows本地化中的一个错误 API,而不是类libs。雷格 需要检查值 终结者。他们在看。

    …… here's a report on Microsoft Connect 关于这个问题:

        2
  •  6
  •   Nick Berardi    15 年前

    尝试

    int i = Int32.Parse(value, NumberStyles.Any);
    
        3
  •  5
  •   John Rayner    15 年前
    int i = int.parse(value.TrimStart('0'));
    
        4
  •  4
  •   johnc    15 年前

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

    }

        5
  •  1
  •   Guffa    15 年前

    你什么都不用做。添加前导零不会导致FormatException。

    为了百分之百肯定我试过你的代码,在改正之后 parse Parse 它运行得很好,没有抛出任何异常。

    显然,您没有显示正在使用的实际代码,因此无法确定问题在哪里,但对于 解析 方法来处理前导零。

        6
  •  1
  •   Wim    15 年前

    尝试

    int i=转换为.toint32(值);

    编辑 :hmm.正如所指出的,它只是包装为int32.parse。不管怎样,不知道您为什么会得到FormatException。

        7
  •  1
  •   David.Chu.ca    13 年前

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

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

    这将消除所有多余的前导0,并避免只有一个0的情况。

        8
  •  1
  •   antonio    7 年前

    对于十进制数:

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

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

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