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?

DRing
la source
4
[myStr = myStr.replaceAll ("[^ \\ d]", "")] [1] [1]: stackoverflow.com/questions/1533659/…
Bitmap
2
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.
Adam Zalcman

Réponses:

521

Essayez ce code:

String str = "a12.334tyz.78x";
str = str.replaceAll("[^\\d.]", "");

Maintenant , strcontiendra "12.334.78".

Óscar López
la source
18
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.

Peter Lawrey
la source
Vous ne devez pas échapper au point dans votre expression rationnelle.
Adam Zalcman
Pourriez-vous, s'il vous plaît, expliquer ce que signifie ^et .signifie cette déclaration?
Mansour Fahad
1
@MansourFahad Dans un regex [^signifie pas ces personnages et à l'intérieur d'un []a .est juste un.
Peter Lawrey
1
Puisqu'un .est juste un aet ne veut rien dire, puis-je simplement m'en débarrasser?
Mansour Fahad
@MansourFahad uniquement si vous ne voulez pas .de résultat dans votre résultat.
methodsignature
44
String phoneNumberstr = "Tel: 00971-557890-999";
String numberRefined = phoneNumberstr.replaceAll("[^\\d-]", "");

résultat: 0097-557890-999

si vous n'avez pas non plus besoin de "-" dans String, vous pouvez faire ceci:

String phoneNumberstr = "Tel: 00971-55 7890 999";      
String numberRefined = phoneNumberstr.replaceAll("[^0-9]", "");

résultat: 0097557890999

Faakhir
la source
Merci pour le grand answe !! r
shridutt kothari
20

Avec goyave:

String input = "abx123.5";
String result = CharMatcher.inRange('0', '9').or(CharMatcher.is('.')).retainFrom(input);

voir http://code.google.com/p/guava-libraries/wiki/StringsExplained

Kerem Baydoğan
la source
1
Pourquoi diable auriez-vous besoin de la goyave pour une tâche aussi simple et essentielle?!
egorikem
@egorikem si votre projet utilise déjà la goyave, vous pouvez l'utiliser sans frais supplémentaires ..
stan
19
str = str.replaceAll("\\D+","");
Angoranator777
la source
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:

public static String getOnlyNumerics(String str) {
    if (str == null) {
        return null;
    }
    StringBuffer strBuff = new StringBuffer();
    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();
}
shridutt kothari
la source
3

Une façon de le remplacer par un flux java 8:

public static void main(String[] args) throws IOException
{
    String test = "ab19198zxncvl1308j10923.";
    StringBuilder result = new StringBuilder();

    test.chars().mapToObj( i-> (char)i ).filter( c -> Character.isDigit(c) || c == '.' ).forEach( c -> result.append(c) );

    System.out.println( result ); //returns 19198.130810923.
}
Orin
la source
3

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 
 United Kingdom  £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

Et voici comment je le résous:

import java.text.DecimalFormatSymbols;
import java.util.Locale;

code:

    public static String getDigit(String quote, Locale locale) {
    char decimalSeparator;
    if (locale == null) {
        decimalSeparator = new DecimalFormatSymbols().getDecimalSeparator();
    } else {
        decimalSeparator = new DecimalFormatSymbols(locale).getDecimalSeparator();
    }

    String regex = "[^0-9" + decimalSeparator + "]";
    String valueOnlyDigit = quote.replaceAll(regex, "");
    try {
        return valueOnlyDigit;
    } catch (ArithmeticException | NumberFormatException e) {
        Log.e(TAG, "Error in getMoneyAsDecimal", e);
        return null;
    }
    return null;
}

J'espère que cela peut aider ».

Maher Abuthraa
la source
3

Pour les gens d'Android qui viennent ici pour Kotlin

val dirtyString = "💰 Account Balance: $-12,345.67"
val cleanString = dirtyString.replace("[^\\d.]".toRegex(), "")

Production:

cleanString = "12345.67"

Cela pourrait ensuite être converti en toute sécurité toDouble(), toFloat()ou toInt()si nécessaire

Michael
la source
Ou Number, en pur Java.
Alex Byrth