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(\)
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
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);
}
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
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"