Hola.
Una forma sería recorrer la cadena String en busca de caracteres numéricos.
Al encontrar uno, lo podemos concatenar en otro String a parte y seguir buscando.
Si el siguiente carácter también es numérico, lo concatenamos en dicho String.
Cuando se encuentre un carácter que NO es numérico, lo que hacemos es comprobar si en el String donde hemos ido concatenado números, hay algo.
Si NO esta vacío, es que ya hemos concatenado una serie de números que componen una cifra. Así que este es el momento de convertir esa "subcadena" a tipo numérico y acumular la suma.
Y volvemos a dejar la subcadena vacía, para que el método siga buscando y cuando encuentre nuevos caracteres numéricos, repita el proceso de concatenarlos.
Bien, he escrito este método y funciona CASI bien.
private static void sumaNumerosCadena() {
Scanner teclado = new Scanner(System.in);
System.out.print("Cadena: ");
String cadena = teclado.nextLine();
teclado.close();
int suma = 0; //Aquí sumaremos los números encontrados
String subCadena = "";//Aquí concatenaremos los caracteres que representen cifras de números
for (int i = 0; i < cadena.length(); i++) {
//Buscamos caracteres que representen cifras
switch(cadena.charAt(i)) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
//Se ha encontrado una caracter numérico
subCadena = subCadena + cadena.charAt(i);//Concatenamos en la subCadena
break;
default:
/*
* El carácter no es numérico. Sin embargo, es posible que en
* la "subCadena" ya tengamos algunos numéros encontrados previamente.
* Hay que comprobarlo y en caso de tener algo, convertirlo a tipo numérico
* para poder acumular la suma
*/
if (!subCadena.isEmpty()) {//No está vacía, hay números, los computamos
System.out.println("Valor numérico detectado: " + subCadena);
//Parseamos la cadena a tipo entero
int valorNum = Integer.parseInt(subCadena);
//Acumulamos suma
suma += valorNum;
//Vacíamos la subCadena para cuando se vuelva a encontrar números en la cadena
subCadena = "";
}
}//fin del switch
}//fin del bucle for
System.out.println("\nLa suma de los números encontrados es: " + suma);
}
Al probarlo, me doy cuenta de que si al final de la cadena hay una cifra, no la recoge.
Cadena: estaban 12 niñas a las 8 pm en la calle 123
Valor numérico detectado: 12
Valor numérico detectado: 8
La suma de los números encontrados es: 20
¿Por qué ocurre esto?
Porque resulta que yo solo compruebo la subcadena cuando encuentro un carácter que No es número.
¿Y qué pasa si las últimos caracteres son TODOS numéricos?
Pues que cuando el bucle termina porque ya no quedan caracteres por comprobar, resulta que
SÍ tengo esa última cifra concatenada en la subcadena, pero el programa termina sin que nadie se preocupe de convertirla a número y hacer la suma.
Entonces, para solucionarlo, después del switch, hay que hacer una comprobación extra.
Hay que preguntar si estamos ya en el último carácter, y si además la cadena NO está vacía.
if (i == (cadena.length()-1) && !subCadena.isEmpty())
En cuyo caso, convertimos lo que haya a entero, y sumamos.
El método corregido queda así:
private static void sumaNumerosCadena() {
Scanner teclado = new Scanner(System.in);
System.out.print("Cadena: ");
String cadena = teclado.nextLine();
teclado.close();
int suma = 0; //Aquí sumaremos los números encontrados
String subCadena = "";//Aquí concatenaremos los caracteres que representen cifras de números
for (int i = 0; i < cadena.length(); i++) {
//Buscamos caracteres que representen cifras
switch(cadena.charAt(i)) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
//Se ha encontrado una caracter numérico
subCadena = subCadena + cadena.charAt(i);//Concatenamos en la subCadena
break;
default:
/*
* El carácter no es numérico. Sin embargo, es posible que en
* la "subCadena" ya tengamos algunos numéros encontrados previamente.
* Hay que comprobarlo y en caso de tener algo, convertirlo a tipo numérico
* para poder acumular la suma
*/
if (!subCadena.isEmpty()) {//No está vacía, hay números, los computamos
System.out.println("Valor numérico detectado: " + subCadena);
//Parseamos la cadena a tipo entero
int valorNum = Integer.parseInt(subCadena);
//Acumulamos suma
suma += valorNum;
//Vacíamos la subCadena para cuando se vuelva a encontrar números en la cadena
subCadena = "";
}
}//fin del switch
/*
* Cuando estamos ya en el último carácter de la cadena,
* conviene revisar si hay algo concatenado en la "subCadena".
* Ya que como no quedan caracteres por comprobar, el bucle
* va a terminar y puede quedarse algo concatenado pendiente
* de ser convertido a valor numérico
*/
if (i == (cadena.length()-1) && !subCadena.isEmpty()) {
System.out.println("Valor numérico detectado: " + subCadena);
int valorNum = Integer.parseInt(subCadena);
suma += valorNum;
}
}//fin del bucle for
System.out.println("\nLa suma de los números encontrados es: " + suma);
}
Y ahora en pantalla podemos ver que ya sí funciona correctamente y detecta todas las cifras, incluso la que está al final de la cadena:
Cadena: estaban 12 niñas a las 8 pm en la calle 123
Valor numérico detectado: 12
Valor numérico detectado: 8
Valor numérico detectado: 123
La suma de los números encontrados es: 143