Ich habe versucht, eine Zeichenfolge zu nehmen und gibt dann eine Zeichenfolge mit den Zahlen 1 bis 10 mit dem Wort für diese Zahlen ersetzt. Zum Beispiel:Ersetzen Sie Dezimalzahlen 1 bis 10 mit Namen ("eins", "zwei" ..)
Ich gewann 7 der 10 Spiele und erhielt 30 Dollar.
sollte geworden:
I gewann sieben der zehn Spiele und erhielt 30 Dollar.
Also tat ich dies:
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));
Und das Ergebnis ist folgendes:
ich gewann sieben der one0 Spiele und erhielt three0 Dollar.
Also versuchte ich einen Brute-Force-Weg, die ich bin sicher, mit regulären Ausdrücken oder eleganter String-Manipulation verbessert werden könnte:
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;
}
}
Gibt es einen besseren Weg? Besonders interessiert an Regex-Vorschlägen.
Dies scheint ein ziemlich einfacher Aufruf von String.replaceAll() würde ausreichen. Stellen Sie sicher, dass Sie mit 10 beginnen, um das Problem von "one0" zu vermeiden. –
Sie könnten versuchen, '10' an die Vorderseite des Arrays zu verschieben, so dass es vor' 1' ausgewertet wird. Aber es gibt wahrscheinlich eine richtigere Änderung. – crush
@KevinWorkman Das OP muss auch damit umgehen, dass die "3" in "30" durch "drei" ersetzt wird. – GriffeyDog