2017-09-07 44 views
0

以下Java代码部分扫描给定的字符串以查找数字序列(单个或分组)。但我发现的问题是,我需要将数字的名称作为单独的而不是分组。也就是说,如果字符串有"Hello78, my name is number07 and not number1",而不是打印为"Seventy Eight",我怎样才能得到它"Seven Eight"将数字从字符串转换为Java中的文本

Pattern patternString = Pattern.compile("\\d+"); 
    String inputText = "32h28ello12'34' this is a test89 87"; 
    Matcher findNumber = patternString.matcher(inputText); 
    Scanner findText = new Scanner(inputText); 
    findText.useDelimiter("[^\\p{Alnum},\\.-]"); 
    int counter = 0; 
    List<String> list = new ArrayList<>(); 

    while (findNumber.find()) { 
     list.add(findNumber.group()); 

     System.out.println(findNumber.group(0)); 
    } 

所以,这是输出的一个例子,是想引导自己:

32 
28 
12 
34 
89 
87 
----------------------------------------------- 
LIST: [32, 28, 12, 34, 89, 87] 
32h28ello12'34' this is a test89 87 
----------------------------------------------- 

我使用下面的一行继续测试和更换文本的数量,但后来我意识到我需要替换那个位置的整个号码。也就是说,如果是30,则文本是"Three Zero",而不是单独的"Three"或单独的"Zero"

numString = inputText.replace(Character.toString(inputText.charAt(atPos)), one); 

有些想法我已经是例如,投入另一个变量每个输出数量,读回,然后把它分解(每个)和写数字的名字,但我想不出怎么做。任何想法将不胜感激。

+2

您应该通过char迭代字符串char,如果char值介于49和57之间,则使用switch-case语句将字符值打印为字符串! –

+0

我在想这样的事情,但它意味着写很多代码(只是寻找替代品)。不确定使用开关盒。你有这个案例的一个小例子吗? –

+1

扫描字符串的字符;使用'Character.isDigit(ch)'来测试每个人是否是一个数字。如果没有,只需将其附加到结果字符串。如果它是一个数字,使用'Character.digit(ch,10)'获取它的数值,然后使用该值来索引一个包含数字名称的'String'数组,并将该文本附加到结果中。 –

回答

1

使用StringBuilder而不是不断创建新的中间字符串。

StringBuilder sb = new StringBuilder(); 
for (char c : inputText) { 
    switch (c) { 
    case '0': 
     sb.append("zero "); 
     break; 
    // similar for '1 thru '9' 
    default: 
     sb.append(c); 
     break; 
    } 
} 
String output = sb.toString(); 
+0

只有一个数字时,这不会占用额外的空间吗? –

+0

使用'StringJoiner'代替,同样的好处,你将不需要修剪结果文本 – MadProgrammer

1

使用Map<Character, String>

Map<Character, String> map = new HashMap<>(); 
    map.put('0', "zero"); 
    map.put('1', "one"); 
    map.put('2', "two"); 
    map.put('3', "three"); 
    map.put('4', "four"); 
    map.put('5', "five"); 
    map.put('6', "six"); 
    map.put('7', "seven"); 
    map.put('8', "eight"); 
    map.put('9', "nine"); 

    String inputString = "Hello78, my name is number07 and not number1"; 

    StringBuilder builder = new StringBuilder(); 
    for (int i = 0; i < inputString.length(); i++) { 
     builder.append(map.getOrDefault(inputString.charAt(i), String.valueOf(inputString.charAt(i)))); 
    } 

    String outputString = builder.toString(); 

编辑: 使用String[]由@Kevin安德森在评论建议(这看起来好多了):

 String[] array = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; 

     String inputString = "Hello78, my name is number07 and not number1"; 

     StringBuilder builder = new StringBuilder(); 
     for (int i = 0; i < inputString.length(); i++) { 
      if (Character.isDigit(inputString.charAt(i))) { 
       builder.append(array[Character.digit(inputString.charAt(i), 10)]); 
      } else { 
       builder.append(inputString.charAt(i)); 
      } 
     } 

     String outputString = builder.toString(); 

outputString将有Helloseveneight, my name is numberzeroseven and not numberone在上述任一解决方案中。

您需要处理单词开头/结尾处的空格。

+0

我认为这可能工作!非常感谢,也感谢其他人。欢迎提供更多答案以供进一步参考。 –

2

如果你期待"HelloSeven Eight, my name..."为你放出来,那么你可以使用这个:

String[] numberTexts = {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}; 
    StringBuilder builder = new StringBuilder(); 
    String inputText = "32h28ello12'34' this is a test89 87"; 

    for (int i=0; i < inputText.length(); i++) { 
     char c = inputText.charAt(i); 
     if (Character.isDigit(c)) { 
      String numberText = numberTexts[Character.getNumericValue(c)]; 
      builder.append(numberText); 
      // append space if next character is a digit 
      if (i < inputText.length() - 1 && Character.isDigit(inputText.charAt(i+1))){ 
       builder.append(" "); 
      } 
     } else { 
      builder.append(c); 
     } 
    } 

    System.out.println(builder.toString()); 

这里inputText迭代所有字符和数字与他们的文字代替。如果下一个字符是数字,则会附加空格字符。

相关问题