在Java中将数字从字符串转换为文本

在Java中将数字从字符串转换为文本,java,Java,Java代码的以下部分扫描给定的字符串,以查找单个或分组的数字序列。但我发现的问题是,我需要将数字的名称写为单独的,而不是分组的。也就是说,如果字符串有“Hello78,我的名字是number07而不是number1”,而不是打印为“七十八”,我如何将其设置为“七八” 我使用下面的行继续测试并替换文本的数字,但是我意识到我需要替换该位置的整数。也就是说,如果它是30,那么文本是“三个零”,而不是“三个”,或者“零” numString = inputText.replace(Character.

Java代码的以下部分扫描给定的字符串,以查找单个或分组的数字序列。但我发现的问题是,我需要将数字的名称写为单独的,而不是分组的。也就是说,如果字符串有
“Hello78,我的名字是number07而不是number1”
,而不是打印为
“七十八”
,我如何将其设置为
“七八”

我使用下面的行继续测试并替换文本的数字,但是我意识到我需要替换该位置的整数。也就是说,如果它是30,那么文本是
“三个零”
,而不是
“三个”
,或者
“零”

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

例如,我有一些想法,把每个输出数字放在另一个变量中,读回,然后拆分(每个)并写下数字的名称,但我不知道怎么做。任何想法都将受到欢迎。

使用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();

使用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();
使用
映射

outputString
将具有
hellosevenight,在上述任一解决方案中,我的名字是numberzeroseven,而不是numberone

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

使用
Map

outputString
将具有
hellosevenight,在上述任一解决方案中,我的名字是numberzeroseven,而不是numberone


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

如果您希望输出为
“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());
String[]numberTexts={“零”、“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”};
StringBuilder=新的StringBuilder();
字符串inputText=“32h28ello12'34”这是一个test89 87”;
对于(int i=0;i

此处对所有字符迭代
inputText
,并用其文本替换数字。如果下一个字符是一个数字,则会附加一个空格。

如果您希望输出为
“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());
String[]numberTexts={“零”、“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”};
StringBuilder=新的StringBuilder();
字符串inputText=“32h28ello12'34”这是一个test89 87”;
对于(int i=0;i

此处对所有字符迭代
inputText
,并用其文本替换数字。如果下一个字符是数字,则会追加一个空格。

您应该逐字符迭代字符串,如果字符值介于49和57之间,请使用switch case语句将字符值打印为字符串!我是这样想的,但这意味着要写很多代码(只是寻找替代方案)。不确定开关箱的使用情况。你有这个例子吗?浏览一下你的字符串中的字符;使用
Character.isDigit(ch)
测试每个字符,看它是否是数字。如果没有,只需将其附加到结果字符串中。如果是数字,请使用
Character.digit(ch,10)
获取其数值,然后使用该值对包含数字名称的
String
s数组进行索引,并将该文本附加到结果中。为什么不使用
Map
将10位字符作为键,并将对应的字符串作为值。然后只需遍历字符串并用map中关联的值替换数字??您应该逐字符迭代字符串,如果字符值介于49和57之间,则使用switch case语句将字符值打印为字符串!我是这样想的,但这意味着要写很多代码(只是寻找替代方案)。不确定开关箱的使用情况。你有这个例子吗?浏览一下你的字符串中的字符;使用
Character.isDigit(ch)
测试每个字符,看它是否是数字。如果没有,只需将其附加到结果字符串中。如果是数字,请使用
Character.digit(ch,10)
获取其数值,然后使用该值对包含数字名称的
String
s数组进行索引,并将该文本附加到结果中。为什么不使用
Map
将10位字符作为键,并将对应的字符串作为值。然后只需遍历字符串并用map中关联的值替换这些数字??当有一个数字时,这不会有额外的空间吗?使用
StringJoiner
,同样的好处是,您不需要修剪结果文本。当有一个数字时,这不会有额外的空间吗?使用
StringJoiner
,同样的好处,你将不需要修剪产生的文本我认为这可能会工作!非常感谢,也感谢其他人。
        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();
    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());