2017-07-30 35 views
0

我正在做一個分數計算器,我已經有了所有的操作代碼。如何將字符串分數「2/6」轉換爲兩個整數? Java

但現在我想創建一個Scanner,需要一個String並轉換成(分子和分母)。

用戶輸入String應採用以下格式:編號/編號。如果是別的,我會讓掃描儀再次出現。

我已經擁有的代碼可以處理負數Integers,所以-符號和0不應該成爲問題。

回答

1

您可以隨時使用String.split()分裂基礎上的分隔符字符串,在這種情況下/,然後String.trim()輸出,並分析他們獲得的分子和分母。

0

你可以使用一個正則表達式,在同一時間,實施正確的格式化字符串模式,並能夠提取分子和支配:

Pattern inputPattern = 
    Pattern.compile("\\A(?<numerator>-?\\d+)[ ]*\\/[ ]*(?<denominator>-?\\d+)\\z"); 
Matcher matcher = inputPattern.matcher(inputString); 
if (matcher.matches()) { 
    //valid inputstring 
    int numerator = Integer.parseInt(matcher.group("numerator")); 
    int denominator = Integer.parseInt(matcher.group("denominator")); 

} else { 
    letTheScannerAppearAgain(); 
} 

這裏使用的模式包含兩個命名組由圓括號(..)標記,並用斜線分隔(由於斜線在正則表達式中也有含義) 分子/分母可能以負號開始,並且應該至少包含一個數字。允許斜線前後的空格。

+0

我覺得這是最好的答案,我沒有與java.util.regex.Matcher中和java.util.regex.Pattern中的很多經驗,因爲這賦值是一個基本的Java課程。但我會閱讀更多關於這個。謝謝! – Quetzy

+0

我會這樣做,但是以輸入開始和結束符輸入('\\ A'和'\\ z')而不是起始符和結束符符號(' ^'和'$'),因爲你擁有它的方式,像'5/5 \ n6/7「這樣的字符串也會被匹配。 – tradeJmark

+0

我也推薦使用命名捕獲組和數字之間的可選間隔(這更多的是根據你想要的可接受格式進行判斷),所以在我的情況下,正則表達式將變成'「\\ A(? - 使用這個正則表達式,組訪問變成了'matcher.group(「numerator」)''和''+'' matcher.group( 「分母」)'。更容易跟蹤正則表達式是否改變。 – tradeJmark

0

您可以將字符串拆分爲「/」,並按以下方式提取分子和分母。

public void scan(String string){ 
if(string.matches("-{0,1}[0-9]+\\/[0-9]+"){ 
    String[] numbers = string.split("/"); 

    int numerator = Integer.parseInt(numbers[0]); 
    int denominator = Integer.parseInt(numbers[1]); 
} 
else{ 
    scan(string); 
} 
} 
+0

在這種情況下會發生什麼,如果用戶輸入「三/ 12」或其他沒有'/'的其他內容? – Quetzy

+0

我添加了一個條件,如果它不是以數字/數字的格式再次調用掃描。但我不明白你會如何處理其他情況。遵循上述方法會在不匹配時導致無限循環。 –

+0

我可以照顧其他的陳述,非常感謝你的幫助。 – Quetzy