Separar texto de valor em uma string?

Estou com a seguinte duvida, tenho uma string ( varias na verdade )

Exemplo:

Antonio da Silva 225.36
Zé 96.24
Mario Fulano de tal 7254.25

Qual seria a melhor forma de separar o nome do valor?
Estou usando um replaceAll(), mas não sei se seria a melhor forma.

Se alguém tiver alguma dica melhor, fico grato.

Se fosse apenas um nome sem espaços entre eles bastaria usar o split:
String nomeValor = “Antonio da Silva 225.36”;
String nome = nomeValor.split(" ")[0];
String valor = nomeValor.split(" ")[1];
double valor2 = Double.parse(nomeValor.split(" ")[1]);

Você sabe usar expressões regulares?

O padrão parece ser: \w+\d+\.\d{2},
onde \w+ = um ou mais caracteres alfanuméricos
          \d+ = um ou mais caracteres numéricos
          \d{2} = exatamente dois caracteres numéricos
          \. = um ponto decimal
          e os parentêses separam os grupos: $1, $2, …
Assim eu tentaria:
String nomeValor = “Antonio da Silva 225.36”;
String nome = nomeValor.ReplaceFirst("(\w+)\d+\.\d{2}", “$1”);
String valor = nomeValor.ReplaceFirst("\w+(\d+\.\d{2})", “$1”);
double valor2 = Double.parse(nomeValor.ReplaceFirst("\w+(\d+\.\d{2})", “$1”));
PS: use duas contrabarras(\)

olá, tentei executar o código do ventura jr mas o eclipse acusa erro.
Vou postar como eu faria:

package tmpteste;

public class Demonstra {
public static void main(String args[]) {
String nome[] = { “Antonio da Silva 225.36”, “Zé 96.24”, “Mario Fulano de tal 7254.25” };
for (int i = 0; i < nome.length; i++) {
System.out.println(nome[i]);
String buffer = nome[i];
int y = 0;
while (y < buffer.length() && !Character.isDigit(buffer.charAt(y))) y++;
int j = y;
String dividir = buffer.substring(0, j-1).concat(",").concat(buffer.substring(j, buffer.length()-1));
String dadosDivididos[] = dividir.split(",");
System.out.println("Cliente: " + dadosDivididos[0]);
System.out.println("Vendas: R$ " + dadosDivididos[1]);

	}
}

}

1 curtida

replace é para substituir partes do conteúdo da String.

Pode usar uma expressão regular com as classes Pattern e Matcher.

Exemplo:

String[] linhas = new String[] {
        "Antonio da Silva 225.36",
        "Zé 96.24",
        "Mario Fulano de tal 7254.25",
};
String regexNome = "[\\w+\\s*]+";
String regexValor = "\\d+\\.\\d+";
String regex = "(" + regexNome + ") (" + regexValor + ")";
Pattern pattern = Pattern.compile(regex);
for (String linha : linhas) {
    Matcher matcher = pattern.matcher(linha);
    if (matcher.find()) {
        String nome = matcher.group(1);
        double valor = Double.parseDouble(matcher.group(2));
        System.out.println("Nome: " + nome);
        System.out.println("Valor: " + valor);
        System.out.println();
    }
}

Fiz algumas correções:

import java.util.Locale;

public class SepararNomeDeValor {

   String nomeValor;
   String nome;
   String valor;
   double valor2;

   public void init() {
         nomeValor = “Antonio da Silva 225.36”;

         // Recupera o padrão de uma ou mais letras ou espaços antes do primeiro dígito
         nome = nomeValor.replaceFirst("([a-zA-Z ]+)\d+.\d{2}", “$1”);
         // Recupera apenas dígitos seguidos de um ponto decimal(.) e dois dígitos
         valor = nomeValor.replaceFirst("[a-zA-Z ]+(\d+.\d{2})", “$1”);
         // Para aceitar o padrão de ponto decimal no lugar da vírgula
         Locale.setDefault(Locale.US);
         // Para converter para double
         valor2 = Double.parseDouble(nomeValor.replaceFirst("[a-zA-Z ]+(\d+.\d{2})", “$1”));
         System.out.println(“Original: " + nomeValor);
         System.out.println(” nome: " + nome);
         System.out.println(" valor: " + valor);
         System.out.println(" valor2: " + valor2);
}

public static void main(String[] args) {
	
	new SepararNomeDeValor().init();
	
}

}
Saída:
Original: Antonio da Silva 225.36
    nome: Antonio da Silva
     valor: 225.36
   valor2: 225.36

1 curtida

fventurajr obrigado pela dica, li um pouco mas acabei não entendendo, mas a sua ajuda me fez ter uma luz para solucionar o meu problema.

flavioBlumenau sou grato pela atenção, achei muito interessante a sua forma de fazer essa verificação mas essa como terei N registo para fazer essa alteração, em media mais de 10 mil eu acredito que isso começaria a pesas na rotina.

staroski muito obrigado pela atenção, verifiquei que no caso de existir alguma letra com acentuação no nome a mesma não é mostrada.

De coração muito obrigado a todos, mas eu acabei indo pelo mais simples, mas com algumas melhorias devido a ajuda de vocês.

Ficou assim:

 String[] separar = {"Antônio da Silvá 225.36", "Zé 96.24", "Mario Fulano de tal 7254.25"};
        for (String registro : separar) {

            String nome = registro.replaceAll("[0-9,.]", "").trim();
            Double valor = Double.parseDouble(registro.replace(nome, ""));
            System.out.println(nome);
            System.out.println(valor);
        }
2 curtidas

nome = nomeValor.replaceFirst("([a-zA-Z ]+)\d+.\d{2}", "$1");
Nessa linha de código, ocorre esse problema no eclipse
Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ ) SepararNomeDeValor.java /tmpteste/src/tmpteste line 16 Java Problem

Muito boa a sua solução. Parabéns por aproveitar as diversas sugestões de um modo original.

Por isso que eu coloquei em PS: Use duas contrabarras(\). Aqui no fórum ele transforma duas contrabarras em uma e também troca as aspas por aspas estilizadas que devem ser trocadas também.

nome = nomeValor.replaceFirst("([a-zA-Z ]+)\\d+.\\d{2}", “$1”);

Ao postar código no meio das frases, coloque o mesmo entre crases.
Por exemplo:
`\\` será renderizado assim: \\
`“minha String”` será renderizado assim: "minha String"

2 curtidas

Obrigado, gostei muito de aprender sobre expressões regulares em Java :slight_smile:

2 curtidas

Valeu a dica. No meu último exemplo, acho que usei 3 barras para aparecerem 2, mas a crase(`) parece mais adequada.

1 curtida