2015-02-05 155 views
2

Java的ParseInt方法捕获的字符串将愉快地解析具有前导零供给十进制值未抛出异常,剥离零:爪哇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's'吗? – TheLostMind 2015-02-05 13:09:02

+0

它是否必须占一个以上领先的0?例如'0050'。此外,领先的空间或类似的东西呢? – 2015-02-05 13:09:50

+0

在我的情况下,允许使用前导空格,但应该捕获一个或多个前导零0050' – 2015-02-05 13:11:36

回答

8

检查的第一个字符是0:

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

if (original.startsWith("0")) 

如果字符串以0开始,你不想打电话给parseInt的。

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

+0

这应该是答案,正则表达式是沉重的。 – Eun 2015-02-05 13:13:00

+0

非常简单。感谢这一点 - 我是新来的Java,只是刚刚开始意识到,像'startsWith'事实上存在... – 2015-02-05 13:15:49

+1

但这不会赶上在评论中注意到的领先空白,并且应该被修剪。 – SomeJavaGuy 2015-02-05 13:16:58

2

,你可以用正则表达式的工作,并检查它是否具有领先的0

,你可以只写

看到你对领先的空格评论beeing让你可以使用后:

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

这方式00000仍然是零,如果它是有效的

0

当你得到一个字符串输入,你可以使用方法String.charAt(int) chec k表示明确的字符。 但是,当您刚刚使用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初始化。

我希望这有助于!