2013-06-04 152 views
0

我有一個讀取7個字符的字母數字代碼(由用戶輸入)的掃描器。該字符串變量被稱爲「代碼」。比較字符串整數問題

代碼的最後一個字符(第7個字符,第6個索引)必須是數字,其餘字母可以是數字或字母。如果代碼中的最後一個字符只是一個數字(從0到9),就會停止執行其餘的方法。但是,我的代碼不能按預期工作,即使我的代碼以0到9之間的整數結尾,if語句也會被滿足,並打印出「代碼中的最後一個字符是非數值的」。

示例代碼:45m4av7

CharacterAtEnd打印出的字符串的字符7,因爲它應該 但是我的程序仍告訴我,我的代碼結束非數字 我知道,我的電話號碼的值是字符串。字符,但它不應該的事,應該嗎? 也我顯然不能比較實際的整數值與「|」,這主要是爲什麼即時通訊使用Strin g.valueOf,並取0-9的字符串。

String characterAtEnd = String.valueOf(code.charAt(code.length()-1)); 
System.out.println(characterAtEnd); 

if(!characterAtEnd.equals(String.valueOf(0|1|2|3|4|5|6|7|8|9))){ 
    System.out.println("INVALID CRC CODE: last character in code in non-numerical."); 
    System.exit(0); 

我不能爲我的生命,弄清楚爲什麼我的計劃告訴我,我的代碼(即有7月末)結束非數值。它應該跳過if語句並繼續。對?

+0

嘗試使用正則表達式。 [鏈接](http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/) – SaintLike

+0

請用編程語言標記您的問題。 – Barmar

+0

http://stackoverflow.com/questions/1223052/how-do-i-find-out-if-first-character-of-a-string-is-a-number –

回答

0

Stringcontains方法將在這裏工作:

String digits = ""; 
digits.contains(characterAtEnd); // true if ends with digit, false otherwise 

String.valueOf(0|1|2|3|4|5|6|7|8|9)實際上是"15",這當然絕不等於最後一個字符。這應該是有道理的,因爲0|1|2|3|4|5|6|7|8|9使用整數數學計算爲15,然後轉換爲字符串。

另外,試試這個:

String code = "45m4av7"; 
char characterAtEnd = code.charAt(code.length() - 1); 
System.out.println(characterAtEnd); 

if(characterAtEnd < '0' || characterAtEnd > '9'){ 
    System.out.println("INVALID CRC CODE: last character in code in non-numerical."); 
    System.exit(0); 
} 
+0

是否可以說「或」在使用整數的if語句? like if(whatever.equals(1 or 2 or 3 or 4 or 5)){ then do this; } 非常感謝你的幫助! – SmashAdams

+1

語言'||'保留用於邏輯組合布爾值。所以你必須去'characterAtEnd.equals(「0」)|| characterAtEnd.equals(「1」)|| ...' –

+0

這就是爲什麼我選擇物流或方法。我創建了所有可接受的結束字符集,並檢查最後一個字符是否在可接受的集合中,如果是其他字符,則返回false。它具有或邏輯,沒有明確使用或。 –

0

您在這裏做的位操作:if(!characterAtEnd.equals(String.valueOf(0|1|2|3|4|5|6|7|8|9)))

退房|||

的區別這段代碼應該使用常規完成任務表達:

String code = "45m4av7"; 

if (!code.matches("^.+?\\d$")){ 
    System.out.println("INVALID CRC CODE"); 
} 

此外,僅供參考,這種方法有時就派上用場了類似的情況:

/* returns true if someString actually ends with the specified suffix */ 
someString.endsWith(suffix); 

由於.endswith(suffix)不採取正則表達式,如果你想通過所有可能的小寫字母值,你需要做這樣的事情:

/* ASCII approach */ 
String s = "hello"; 
boolean endsInLetter = false; 
for (int i = 97; i <= 122; i++) { 
    if (s.endsWith(String.valueOf(Character.toChars(i)))) { 
     endsInLetter = true; 
    } 
} 
System.out.println(endsInLetter); 

/* String approach */ 
String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
boolean endsInLetter2 = false; 
for (int i = 0; i < alphabet.length(); i++) { 
    if (s.endsWith(String.valueOf(alphabet.charAt(i)))) { 
     endsInLetter2 = true; 
    } 
} 
System.out.println(endsInLetter2); 

注意,無論是前述的方法是一個好主意 - 他們是笨重,效率很低。

去關閉ASCII方式,你甚至可以做這樣的事情:

ASCII參考:http://www.asciitable.com/

int i = (int)code.charAt(code.length() - 1); 

/* Corresponding ASCII values to digits */ 
if(i <= 57 && i >= 48){ 
    System.out.println("Last char is a digit!"); 
} 

如果你想要一個內膽,堅持正則表達式,例如:

System.out.println((!code.matches("^.+?\\d$")? "Invalid CRC Code" : "Valid CRC Code")); 

我希望這有助於!

+0

嗨!感謝您的答覆。 我嘗試使用您提到的.endsWith方法,它似乎運作良好。我唯一擔心的是,似乎我需要爲字母表中的每個字母重新粘貼26行代碼。而我真的很希望能夠說「如果代碼以a或b或c或d ...結尾,然後打印」無效代碼「,那麼我可以在一個if語句中使用它,這是可能的嗎? 另外,我想知道如果.matches方法,如果它看起來在括號中的項目是單獨的,或作爲一個整體? – SmashAdams

+0

不幸的是,endswith(後綴)不需要正則表達式(據我所知),如果你想檢查字母表中的每個字母,你可以使用一個循環(雖然它會很笨重)。就.matches方法而言,它會查看最後一個項目以確保它是一個小數。已修改我的帖子來幫助你=)祝你好運! –