Java String remove todos os caracteres não numéricos
237
Tentando remover todas as letras e caracteres que não são de 0 a 9 e um ponto final. Estou usando, Character.isDigit()mas ele também remove decimal, como também posso manter o decimal?
Essa é uma maneira estranha de dizer isso. "Não são todas as letras e caracteres que não são de 0 a 9 e um período" equivale a mais simples "todos os caracteres que não são de 0 a 9 e um período"? Quero dizer, letras são caracteres que não são de 0 a 9 nem do ponto final.
Isso também pode funcionar:> str = str.replaceAll ("[\\ D.]", "");
yeaaaahhhh..hamf hamf
1
@ Óscar López: como incluir números negativos também? Quero dizer, eu tenho que substituir tudo o que não é um número positivo / negativo por um espaço vazio. Como fazer isso?
Pankaj Singhal
3
@PankajSinghal simplesmente inclui o sinal de menos no regex:[^\\d.-]
Óscar López
3
@ yeaaaahhhh..hamfhamf não, isso não vai funcionar. Temos que negar todo o grupo (incluindo números e pontos), o código sugerido apenas nega os números e o resultado não inclui pontos, conforme necessário. Você testou ? usando o código de exemplo acima, seu código retorna "1233478"incorreto.
Óscar López
Funciona muito bem, mesmo no Android. Obrigado.
Juanram0n
98
Eu usaria um regex.
String text ="-jaskdh2367sd.27askjdfh23";String digits = text.replaceAll("[^0-9.]","");System.out.println(digits);
Não sei porque as pessoas votaram na sua solução ... Ajudou-me muito, obrigado! Votos em alta!
precisa saber é o seguinte
Obrigado Zarial, vejo que Robert realmente editou minha resposta de str = str.replaceAll ("\ D +", ""); para str = str.replaceAll ("\\ D +", ""); ... Então eu cometi esse erro ao colá-lo na caixa do editor do StackO. Então, obrigado Robert por consertar. Agora funciona!
@SaadBenbouzid huh? qual é a sua definição da mesma resposta exata?
Boris Treukhov 31/01
2
@SaadBenbouzid 1) que é um comentário e não uma resposta 2) que é um regex completamente diferente 3) nem todas as respostas que usam o regex D são idênticas, é como apontar que todas as respostas em linguagem C que printf()são duplicadas. Além disso, se você vir uma resposta no comentário, poderá pedir ao mod para convertê-lo em resposta ou até mesmo adicionar uma resposta por conta própria - as respostas nos comentários são desencorajadas no StackOverlow.
Boris Treukhov
6
Maneira simples sem usar o Regex:
Adicionar uma verificação extra de caracteres para o ponto '.'resolverá o requisito:
publicstaticString getOnlyNumerics(String str){if(str ==null){returnnull;}StringBuffer strBuff =newStringBuffer();char c;for(int i =0; i < str.length(); i++){
c = str.charAt(i);if(Character.isDigit(c)|| c =='.'){
strBuff.append(c);}}return strBuff.toString();}
publicstaticvoid main(String[] args)throwsIOException{String test ="ab19198zxncvl1308j10923.";StringBuilder result =newStringBuilder();
test.chars().mapToObj( i->(char)i ).filter( c ->Character.isDigit(c)|| c =='.').forEach( c -> result.append(c));System.out.println( result );//returns 19198.130810923.}
Ele lida com entradas nulas, números negativos e decimais (você precisa incluir a biblioteca Apache Commons Lang, versão 3.8 ou superior, em seu projeto):
import org.apache.commons.lang3.RegExUtils;
result =RegExUtils.removeAll(input,"-?[^\\d.]");
Respostas:
Tente este código:
Agora
str
irá conter"12.334.78"
.fonte
[^\\d.-]
"1233478"
incorreto.Eu usaria um regex.
impressões
Você também pode manter
-
os números negativos.fonte
^
e o que.
significa nesta declaração?[^
meios não esses personagens e dentro de um[]
um.
é apenas um.
.
é apenas uma
e não significa nada, posso me livrar dele?.
s no resultado.resultado: 0097-557890-999
se você também não precisar de "-" em String, poderá fazer o seguinte:
resultado: 0097557890999
fonte
Com goiaba:
consulte http://code.google.com/p/guava-libraries/wiki/StringsExplained
fonte
fonte
printf()
são duplicadas. Além disso, se você vir uma resposta no comentário, poderá pedir ao mod para convertê-lo em resposta ou até mesmo adicionar uma resposta por conta própria - as respostas nos comentários são desencorajadas no StackOverlow.Maneira simples sem usar o Regex:
Adicionar uma verificação extra de caracteres para o ponto
'.'
resolverá o requisito:fonte
Uma maneira de substituí-lo por um fluxo java 8:
fonte
O separador decimal da moeda pode ser diferente de local para outro. Pode ser perigoso considerar
.
como separador sempre. ieEu acho que o caminho certo é:
DecimalFormatSymbols
Localidade padrão ou um especificado.E aqui como eu estou resolvendo isso:
import java.text.DecimalFormatSymbols;
import java.util.Locale;
código:
Espero que ajude '.
fonte
Para o pessoal do Android que vem aqui pelo Kotlin
Resultado:
Isso pode ser convertido com segurança ou
toDouble()
, se necessáriotoFloat()
toInt()
fonte
Ele lida com entradas nulas, números negativos e decimais (você precisa incluir a biblioteca Apache Commons Lang, versão 3.8 ou superior, em seu projeto):
Referência da biblioteca: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RegExUtils.html
fonte