Separar texto de valor em uma string?

11 respostas
java
W

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.

11 Respostas

F
Se fosse apenas um nome sem espaços entre eles bastaria usar o split:

<strong>String nomeValor = “Antonio da Silva 225.36”;</strong>

<strong>String nome = nomeValor.split(" ")[0];</strong>

<strong>String valor =  nomeValor.split(" ")[1];</strong>

<strong>double valor2 = Double.parse(nomeValor.split(" ")[1]);</strong>

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:

<strong>String nomeValor = “Antonio da Silva 225.36”;</strong>

<strong>String nome = nomeValor.ReplaceFirst("(\w+)\d+\.\d{2}", “$1”);</strong>

<strong>String valor =  nomeValor.ReplaceFirst("\w+(\d+\.\d{2})", “$1”);</strong>

<strong>double valor2 = Double.parse(nomeValor.ReplaceFirst("\w+(\d+\.\d{2})", “$1”));</strong>

<strong>PS: use duas contrabarras(\)</strong>
F

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,  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]);
}
}

}

S

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

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”;

<strong>// Recupera o padrão de uma ou mais letras ou espaços antes do primeiro dígito</strong>

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

         <strong>// Recupera apenas dígitos seguidos de um ponto decimal(.) e dois dígitos</strong>

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

         <strong>// Para aceitar o padrão de ponto decimal no lugar da vírgula</strong>

         Locale.setDefault(<a href="http://Locale.US">Locale.US</a>);

         <strong>// Para converter para double</strong>

         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

W

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);
        }
F

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

F

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

F

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”);

S

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"

F

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

F

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

Criado 17 de outubro de 2019
Ultima resposta 17 de out. de 2019
Respostas 11
Participantes 4