Supprimer tous les caractères non numériques de la chaîne en JavaScript


701

Considérez un scénario non DOM dans lequel vous souhaitez supprimer tous les caractères non numériques d'une chaîne à l'aide de JavaScript / ECMAScript. Tous les caractères à portée 0 - 9doivent être conservés.

var myString = 'abc123.8<blah>';

//desired output is 1238

Comment pourriez-vous y parvenir en JavaScript simple? N'oubliez pas qu'il s'agit d'un scénario non DOM, donc jQuery et d'autres solutions impliquant des événements de navigateur et de pression de touche ne conviennent pas.

Réponses:


1431

Utilisez la .replaceméthode de la chaîne avec une expression régulière de \D, qui est une classe de caractères abrégée qui correspond à tous les non-chiffres:

myString = myString.replace(/\D/g,'');

5
Merci csj; n'importe où pour trouver plus d'informations sur \D?
p.campbell

34
Ceci est ma référence regex par défaut: regular-expressions.info/reference.html Les classes de caractères intégrées ont chacune des compléments intégrés. \ d \ D (chiffres contre tout sauf chiffres) \ w \ W (caractères de caractères contre tout sauf caractères de mots) \ s \ S (espaces contre tout sauf espaces)
csj

3
Juste pour être clair, voici la syntaxe de remplacement: w3schools.com/jsref/jsref_obj_regexp.asp car les barres obliques et le "g" font partie de cette commande, pas du RegEx.
Mike K

fait le replacetravail avec cette syntaxe exacte dans tous les navigateurs? semble que je me souviens avoir obtenu une object has no method 'replace' dans une ancienne version d'IE lorsque j'utilise ceci avec du texte que j'ai saisi avec jQuery ... ou quelque chose comme ça.
cwd

@cwd Je n'ai aucune idée de ce qui a été pris en charge dans les navigateurs passés ou actuels. La question spécifiait un contexte non DOM, il est donc probable que l'affiche effectuait des scripts dans un environnement sans navigateur Web.
csj

354

Si vous en avez besoin pour laisser le point pour les nombres flottants, utilisez ceci

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"

6
Des experts regexp? Comment faire pour autoriser un seul point (très pertinent avec les chiffres). Merci!
Kasperi

1
Que voulez-vous dire? donner un exemple d'entrée et de sortie
max4ever

2
Pas bon: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.Devrait supprimer toute chaîne qui pourrait entourer un nombre ..
vsync

2
@ max4ever vous m'avez sauvé la vie, merci pour la gestion des cas -(négatifs)) :)
Pankaj Parkar

4
@Kasperi peut-être:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy


23

Vous pouvez utiliser un RegExp pour remplacer tous les caractères non numériques:

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238

22

Quelque chose dans le sens de:

yourString = yourString.replace ( /[^0-9]/g, '' );

10
Pas exactement une réponse à la question d'origine, mais une version pour gérer la virgule décimale:yourString = yourString.replace ( /[^0-9.]/g, '' );
Maxim Mai


0

Dans Angular / Ionic / VueJS - je viens de trouver une méthode simple pour:

stripNaN(txt: any) {
    return txt.toString().replace(/[^a-zA-Z0-9]/g, "");
}

Utilisation sur la vue:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>

0

Malheureusement, aucune des réponses ci-dessus n'a fonctionné pour moi.

Je cherchais à convertir des nombres monétaires à partir de chaînes telles que $123,232,122.11(1232332122.11) ou USD 123,122.892(123122.892) ou toute devise comme₹ 98,79,112.50 (9879112.5) pour me donner une sortie numérique comprenant le pointeur décimal.

J'ai dû faire ma propre expression régulière qui ressemble à ceci:

str = str.match(/\d|\./g).join('');

0

Fonction courte pour supprimer tous les caractères non numériques mais conserver la décimale (et renvoyer le nombre):

parseNum = str => +str.replace(/[^.\d]/g, '');
let str = 'a1b2c.d3e';
console.log(parseNum(str));


-5

nous sommes en 2017 maintenant vous pouvez également utiliser ES2016

var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join(''));

ou

console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join(''));  

Le résultat est

1238

12
C'est une manière très inefficace de procéder à cette opération.
djheru

qu'est-ce qui est inefficace ou mauvais ici?
Vladislav Kostenko

5
Il convertit la chaîne en un tableau de chaînes à un seul caractère via une méthode de rechange, puis applique une fonction de filtrage sur JavaScript sur chaque élément du tableau, renvoyant un nouveau tableau de chaînes, pour enfin rejoindre ce tableau en une chaîne. Regex prend une chaîne et retourne une chaîne et le traitement se fait via du code natif.
ShortFuse
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.