我正在嘗試取一個字符串,然後返回一個字符串,數字1到10替換爲這些數字的字。例如:用名稱替換小數點1到10(「1」,「2」..)
我贏了10場比賽中的7場並獲得30美元。
應該變成:
我贏得的遊戲並獲得30美元。
所以我這樣做:
import org.apache.commons.lang3.StringUtils;
String[] numbers = new String[] {"1", "2", "3","4","5","6","7","8","9","10"};
String[] words = new String[]{"one", "two", "three","four","five","six",
"seven","eight","nine","ten"};
System.out.print(StringUtils.replaceEach(phrase, numbers, words));
,結果是這樣的:
我贏得了比賽one0七收到three0美元。
所以我嘗試了蠻力的方式,我相信可以用正則表達式或更優雅的字符串操作加以改進:
public class StringReplace {
public static void main(String[] args) {
String phrase = "I won 7 of the 10 games and received 30 dollars.";
String[] sentenceWords = phrase.split(" ");
StringBuilder sb = new StringBuilder();
for (String s: sentenceWords) {
if (isNumeric(s)) {
sb.append(switchOutText(s));
}
else {
sb.append(s);
}
sb.append(" ");
}
System.out.print(sb.toString());
}
public static String switchOutText(String s) {
if (s.equals("1"))
return "one";
else if (s.equals("2"))
return "two";
else if (s.equals("3"))
return "three";
else if (s.equals("4"))
return "four";
else if (s.equals("5"))
return "fivee";
else if (s.equals("6"))
return "six";
else if (s.equals("7"))
return "seven";
else if (s.equals("8"))
return "eight";
else if (s.equals("9"))
return "nine";
else if (s.equals("10"))
return "ten";
else
return s;
}
public static boolean isNumeric(String s) {
try {
int i = Integer.parseInt(s);
}
catch(NumberFormatException nfe) {
return false;
}
return true;
}
}
是不是有更好的辦法?特別感興趣的正則表達式的建議。
這似乎是一個非常簡單的調用String.replaceAll()就足夠了。只要確保從10開始,以避免「one0」的問題。 –
您可以嘗試將'10'移動到數組的前面,以便在'1'前面進行評估。但可能會有一個更合適的變化。 – crush
@KevinWorkman的OP也需要處理避免「30」中的「3」獲得「三」所取代。 – GriffeyDog