如何阻止下面的代码抛出FormatException
。我希望能够将前导零的字符串解析为整数。有干净的方法吗?
string value = "01";
int i = int.Parse(value);
答案 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