Java String supprime tous les caractères non numériques
237
Essayer de supprimer toutes les lettres et les caractères qui ne sont pas 0-9 et un point. J'utilise Character.isDigit()mais il supprime également les décimales, comment puis-je également conserver les décimales?
C'est une étrange façon de dire cela. N'est-ce pas "toutes les lettres et tous les caractères qui ne sont pas 0-9 et un point" équivalent à plus simple "tous les caractères qui ne sont pas 0-9 et un point"? Je veux dire, les lettres sont des caractères qui ne sont pas 0-9 ni le point.
Cela pourrait également fonctionner:> str = str.replaceAll ("[\\ D.]", "");
yeaaaahhhh..hamf hamf
1
@ Óscar López: comment inclure également les nombres négatifs? Je veux dire, je dois remplacer tout ce qui n'est pas un nombre positif / négatif par un espace vide. Comment faire ça?
Pankaj Singhal
3
@PankajSinghal inclut simplement le signe moins dans l'expression régulière:[^\\d.-]
Óscar López
3
@ yeaaaahhhh..hamfhamf non, cela ne fonctionnera pas. Nous devons nier tout le groupe (y compris les nombres et les points), votre code suggéré ne nie que les nombres, et le résultat n'inclura pas de points, comme requis. L'avez-vous testé ? en utilisant l'exemple de code ci-dessus, votre code retourne "1233478", ce qui est incorrect.
Óscar López
Fonctionne très bien même sous Android. Merci.
juanram0n
98
J'utiliserais une expression régulière.
String text ="-jaskdh2367sd.27askjdfh23";String digits = text.replaceAll("[^0-9.]","");System.out.println(digits);
impressions
2367.2723
Vous voudrez peut-être -aussi garder pour les nombres négatifs.
Je ne sais pas pourquoi les gens ont voté contre votre solution ... M'a beaucoup aidé, merci! Vote!
Zarial
Merci Zarial, je vois que Robert a en fait édité ma réponse à partir de str = str.replaceAll ("\ D +", ""); à str = str.replaceAll ("\\ D +", ""); ... J'ai donc fait cette erreur en la collant dans la boîte de l'éditeur de StackO. Merci donc Robert d'avoir réparé. Maintenant ça marche!
Angoranator777
c'est sous-voté parce que c'est une rediffusion. La même réponse exacte a déjà été sous-titrée il y a 5 ans !! voir ci-dessus: stackoverflow.com/a/10372905/704246
Saad Benbouzid
@SaadBenbouzid hein? Quelle est votre définition de la même réponse exacte?
Boris Treukhov
2
@SaadBenbouzid 1) qui est un commentaire et non une réponse 2) qui est une expression complètement différente 3) toutes les réponses qui utilisent l'expression régulière D ne sont pas identiques, c'est comme indiquer que toutes les réponses en langage C qui utilisent printf()sont des doublons. De plus, si vous voyez une réponse dans un commentaire, vous pouvez demander au mod de la convertir en réponse ou même d'ajouter une réponse par vous-même - les réponses dans les commentaires sont déconseillées sur StackOverlow.
Boris Treukhov
6
Un moyen simple sans utiliser Regex:
L'ajout d'une vérification de caractère supplémentaire pour le point '.'résoudra l'exigence:
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.}
Le séparateur décimal de devise peut être différent d'un paramètre régional à un autre. Il pourrait être dangereux de .toujours considérer comme séparateur. c'est à dire
╔════════════════╦═══════════════════╗║Currency║Sample║╠════════════════╬═══════════════════╣║ USA ║ $1,222,333.44 USD ║║UnitedKingdom║£1.222.333,44 GBP ║║European║€1.333.333,44 EUR ║╚════════════════╩═══════════════════╝
Je pense que la bonne façon est:
Obtenez le caractère décimal via les DecimalFormatSymbolsparamètres régionaux par défaut ou spécifiés.
Cuire le motif d'expression régulière avec un caractère décimal afin d'obtenir uniquement des chiffres
Cela gère les entrées nulles, les nombres négatifs et les décimales (vous devez inclure la bibliothèque Apache Commons Lang, version 3.8 ou supérieure, dans votre projet):
import org.apache.commons.lang3.RegExUtils;
result =RegExUtils.removeAll(input,"-?[^\\d.]");
Réponses:
Essayez ce code:
Maintenant ,
str
contiendra"12.334.78"
.la source
[^\\d.-]
"1233478"
, ce qui est incorrect.J'utiliserais une expression régulière.
impressions
Vous voudrez peut-être
-
aussi garder pour les nombres négatifs.la source
^
et.
signifie cette déclaration?[^
signifie pas ces personnages et à l'intérieur d'un[]
a.
est juste un.
.
est juste una
et ne veut rien dire, puis-je simplement m'en débarrasser?.
de résultat dans votre résultat.résultat: 0097-557890-999
si vous n'avez pas non plus besoin de "-" dans String, vous pouvez faire ceci:
résultat: 0097557890999
la source
Avec goyave:
voir http://code.google.com/p/guava-libraries/wiki/StringsExplained
la source
la source
printf()
sont des doublons. De plus, si vous voyez une réponse dans un commentaire, vous pouvez demander au mod de la convertir en réponse ou même d'ajouter une réponse par vous-même - les réponses dans les commentaires sont déconseillées sur StackOverlow.Un moyen simple sans utiliser Regex:
L'ajout d'une vérification de caractère supplémentaire pour le point
'.'
résoudra l'exigence:la source
Une façon de le remplacer par un flux java 8:
la source
Le séparateur décimal de devise peut être différent d'un paramètre régional à un autre. Il pourrait être dangereux de
.
toujours considérer comme séparateur. c'est à direJe pense que la bonne façon est:
DecimalFormatSymbols
paramètres régionaux par défaut ou spécifiés.Et voici comment je le résous:
import java.text.DecimalFormatSymbols;
import java.util.Locale;
code:
J'espère que cela peut aider ».
la source
Pour les gens d'Android qui viennent ici pour Kotlin
Production:
Cela pourrait ensuite être converti en toute sécurité
toDouble()
,toFloat()
outoInt()
si nécessairela source
Cela gère les entrées nulles, les nombres négatifs et les décimales (vous devez inclure la bibliothèque Apache Commons Lang, version 3.8 ou supérieure, dans votre projet):
Référence de la bibliothèque: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RegExUtils.html
la source