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.

p.campbell
la source

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,'');
csj
la source
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"
max4ever
la source
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
50

Utilisez une expression régulière si votre implémentation de script les prend en charge. Quelque chose comme:

myString.replace(/[^0-9]/g, '');
Auraseer
la source
12
Pour une raison quelconque, cette méthode semble beaucoup plus lisible que [^ \ d].
Arman Bimatov
1
quel est le g après le délimiteur regex ??
Native Coder
3
@NativeCoder stackoverflow.com/questions/12993629/…
RagnaRock
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
CMS
la source
22

Quelque chose dans le sens de:

yourString = yourString.replace ( /[^0-9]/g, '' );
Jan Hančič
la source
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

essayer

myString.match(/\d/g).join``

Kamil Kiełczewski
la source
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>
Subvention
la source
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('');
Légion du chaos
la source
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));

jackosaure
la source
-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
Frank Wisniewski
la source
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