Java ParseInt() - 捕获带前导零的字符串

5

Java的ParseInt方法可以快乐地解析带有前导零的十进制值,而不会抛出异常,并剥离前导零:

int value = Integer.parseInt("050", 10);

将导致整数值为50。

但是,我的应用程序要求拒绝此类字符串作为无效输入。我目前解决这个问题的方法是将解析后的整数转换回字符串,并比较原始/解析后的字符串的长度,以查看是否有任何字符被剥离,例如:

String original = "050";
value  = Integer.parseInt( "050", 10);
String parsed = Integer.toString(value);
if (original.length() != parsed.length()) {
    System.exit(1);
}

这种方法可以正常运行,但感觉有些不专业。有没有更好的方法来检测和处理前导零?


4
你能否使用正则表达式来检查前导0吗?("0's" 在此处是复数形式的“0”) - TheLostMind
它是否必须考虑多个前导0?例如 0050。此外,前导空格或类似的内容呢? - Chris Sprague
在我的情况下,前导空格是允许的,但是一个或多个前导零0050应该被捕获。 - s-low
可能是Javascript parseInt() with leading zeros的重复问题。 - Shawn Bush
@s-low 对的。我是在回复另一个评论者,他将此问题标记为重复问题。你的问题是关于Java中的parseInt问题,而另一个问题则是不同的问题,并且是在Javascript中...(因此报告的重复是不正确的。) - Chris Sprague
显示剩余4条评论
3个回答

12

检查第一个字符是否为0:

if (original.charAt(0)=='0')
或者
if (original.startsWith("0"))
如果字符串以0开头,您根本不需要调用parseInt函数。
我认为与使用正则表达式相比,比较单个字符更有效率。

这应该是答案,正则表达式太重了。 - Eun
太简单了。谢谢你 - 我是Java的新手,才刚开始意识到像startsWith这样的东西实际上存在... - s-low
1
但是这样做将不再捕获注释中注意到的前导空格,因此应该进行修剪。 - SomeJavaGuy

2
你可以使用正则表达式并检查是否有前导0。
你可以直接写:
在看到您关于允许前导空格的评论后,您可以使用:
if(original.matches(".\\s0.*[1-9]")) // Wrong number with leading zeros

这样,如果00000是有效的,它仍然是零。

0

当你获得一个字符串输入时,你可以使用方法String.charAt(int)来检查明确的字符。 然而,当你只使用input.charAt(0)时,用户可以通过添加空格来避免前导零。

我建议做的是:

String decimalChars = "123456789";

boolean reject = true, hasZeros = false;
for (int i = 0; i < input.length; i++) {
    if (input.charAt(i) == '0') { // or other chars you don't want
        hasZeros = true;
        reject = false;
    } else if (decimalChars.contains(input.charAt(i)) {
           if (hasZeros) {
               reject = true;
            } else {
                reject = false;
            }
            break;
        }
    }
}

使用这个方法,您可以通过检查reject来拒绝错误的输入。当它发现一个在decimalChars数组中的字符时,代码将会停止运行。reject如果在之前找到了一个零,则为true,否则为false。此代码还允许在开头添加空格,并且不会拒绝像0000这样的输入。空字符串也将被拒绝,因为reject初始化为true。

希望这能帮到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接