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?


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".


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.


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


Merci pour le grand answe !! r
shridutt kothari


19
str = str.replaceAll("\\D+","");

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

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.
}

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 ».


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


Ou Number, en pur Java.
Alex Byrth

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.