2015-02-05 63 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初始化。

我希望這有助於!