Java 字符串中的数字总和不能正常工作

Java 字符串中的数字总和不能正常工作,java,string,Java,String,我有一个字符串,它包含数字、字符和特殊符号。但我需要计算字符串中的数字之和。 假设我的绳子是 String input = "step@12test_demo,9,8*#1234/add2doe"; 结果应该是12+9+8+1234+2=1265,但对于我的代码,我得到的结果是1+2+9+8+1+2+3+4+2=32。这是我的密码 public class sumOfNumInString { public static void main(String[] args) {

我有一个字符串,它包含数字、字符和特殊符号。但我需要计算字符串中的数字之和。 假设我的绳子是

String input = "step@12test_demo,9,8*#1234/add2doe";
结果应该是12+9+8+1234+2=1265,但对于我的代码,我得到的结果是1+2+9+8+1+2+3+4+2=32。这是我的密码

public class sumOfNumInString {
    public static void main(String[] args) {
        String input = "step@12test_demo,9,8*#1234/add2doe";
        String output = "";
        int temp = input.length();
        for (int i = 0; i < temp; i++) {
            Character c = input.charAt(i);
            if (Character.isDigit(c)) {
                output = output + c;
            }
        }
        int result = Integer.parseInt(output);
        System.out.println(result);
        int num = result, sum = 0, r;
        for (; num != 0; num = num / 10) {
            r = num % 10;
            sum = sum + r;
        }
        System.out.println("Sum of digits of number: " + sum);//32
        //Need output as :12+9+8+1234+2=  1265
    }
} 
公共类字符串{
公共静态void main(字符串[]args){
字符串输入=”step@12test_demo,9,8*#1234/add2doe”;
字符串输出=”;
int temp=input.length();
对于(int i=0;i
您需要识别要添加的数字序列,因为您正在将单个字符添加为数字。将字符串与正则表达式匹配以提取数字,然后解析和添加这些数字应该是可行的

private static final Pattern pattern = Pattern.compile("\\d+");

public static int total(String input) {
    Matcher matcher = pattern.matcher(input);
    int total = 0;

    while (matcher.find()) {
        total += Integer.parseInt(matcher.group(0));
    }

    return total;
}
当使用输入字符串调用时,返回1265


谢谢弗朗西斯科的提示

您需要确定要添加的数字序列,因为您正在将单个字符添加为数字。将字符串与正则表达式匹配以提取数字,然后解析和添加这些数字应该是可行的

private static final Pattern pattern = Pattern.compile("\\d+");

public static int total(String input) {
    Matcher matcher = pattern.matcher(input);
    int total = 0;

    while (matcher.find()) {
        total += Integer.parseInt(matcher.group(0));
    }

    return total;
}
当使用输入字符串调用时,返回1265


谢谢弗朗西斯科的提示

您应该将连续的数字连接起来。您可以构建一个包含数字和运算的字符串,然后对其进行分析

String res = "";
for (int i = 0; i < temp; i++) {
        Character c = input.charAt(i);
        if (Character.isDigit(c)) {
            res  += c.toString();
        }else{
             if(! (res.charAt(res.length() - 1).equals('+')) ) res+= '+';                
           }
    }

你应该把连续的数字连起来。您可以构建一个包含数字和运算的字符串,然后对其进行分析

String res = "";
for (int i = 0; i < temp; i++) {
        Character c = input.charAt(i);
        if (Character.isDigit(c)) {
            res  += c.toString();
        }else{
             if(! (res.charAt(res.length() - 1).equals('+')) ) res+= '+';                
           }
    }

如果您对正则表达式解决方案不感兴趣,您可以简单地迭代所有字符,如果是数字,则将其添加到包含所有连续数字的缓冲区中。当当前字符不是数字时,我们需要重置缓冲区并处理其早期的内容(包括其当前存储的要求和的数字)。为此,您可以选择将字符连接到字符串。最简单和首选的方法是使用StringBuilder

public static int sumOfNumbers(String input) {
    int sum = 0;
    StringBuilder sb = new StringBuilder();

    for (char ch : input.toCharArray()) {
        if (Character.isDigit(ch)) {
            sb.append(ch); //add character to buffer -> "12"+'3'= "123"
        } else if (sb.length() > 0) {
            sum += Integer.parseInt(sb.toString());//increase sum based on current number
            sb.delete(0, sb.length()); // reset buffer for new number
        }
    }
    return sum;
}
用法

输出:

Sum of numbers: 1265

如果您对正则表达式解决方案不感兴趣,您可以简单地迭代所有字符,如果是数字,则将其添加到包含所有连续数字的缓冲区中。当当前字符不是数字时,我们需要重置缓冲区并处理其早期的内容(包括其当前存储的要求和的数字)。为此,您可以选择将字符连接到字符串。最简单和首选的方法是使用StringBuilder

public static int sumOfNumbers(String input) {
    int sum = 0;
    StringBuilder sb = new StringBuilder();

    for (char ch : input.toCharArray()) {
        if (Character.isDigit(ch)) {
            sb.append(ch); //add character to buffer -> "12"+'3'= "123"
        } else if (sb.length() > 0) {
            sum += Integer.parseInt(sb.toString());//increase sum based on current number
            sb.delete(0, sb.length()); // reset buffer for new number
        }
    }
    return sum;
}
用法

输出:

Sum of numbers: 1265

模式也可以写为:
\\d+
。然后while循环变成
while(m.find()){int current=Integer.parseInt(m.group());total+=current;}
。TBH我应该从一开始就寻找这个实现——perl和类似的工具都有简单的方法,可以在一次调用中从字符串中获取每个匹配项。最后要做的是去掉当前的变量。您应该将模式编译从方法中移出,并将其放在类字段中(甚至可能是静态的)避免每次调用方法或构造函数时编译此模式。因为人们不这么做,所以在大多数情况下,regex被错误地认为是非常慢的:/模式也可以写成:
\\d+
。然后while循环变成
while(m.find()){int current=Integer.parseInt(m.group());total+=current;}
。TBH我应该从一开始就寻找这个实现——perl和类似的工具都有简单的方法,可以在一次调用中从字符串中获取每个匹配项。最后要做的是去掉当前的变量。您应该将模式编译从方法中移出,并将其放在类字段中(甚至可能是静态的)避免每次调用方法或构造函数时编译此模式。因为人们不这么做,所以在大多数情况下,正则表达式被错误地认为是非常慢的:这不是一个好的答案,正则表达式可以避免所有这些。看看@Matthew Franglen answer。这不是一个好答案,正则表达式可以避免所有这些。看看@Matthew Franglen的答案。