3

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

效果很好,但感觉有点hacky。是否有更好的方法来检测和处理前导零?

4

3 回答 3

10

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

if (original.charAt(0)=='0')

或者

if (original.startsWith("0"))

如果字符串以 0 开头,则您根本不想调用parseInt

我认为比较单个字符比使用正则表达式更有效。

于 2015-02-05T13:10:26.237 回答
2

你可以使用正则表达式并检查它是否有前导 0

你可以写

在看到您对允许使用前导空格的评论后,您可以使用:

if(original.matches(".\\s0.*[1-9]")) // Wrong number with leading zeros

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

于 2015-02-05T13:11:52.240 回答
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如果之前找到零,则为真,否则为假。此代码还允许在开头使用空格,并且不会拒绝像0000. 空字符串也将被拒绝,因为reject初始化为 true。

我希望这有帮助!

于 2015-02-05T13:42:08.333 回答