1003

Consider a non-DOM scenario where you'd want to remove all non-numeric characters from a string using JavaScript/ECMAScript. Any characters that are in range 0 - 9 should be kept.

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

//desired output is 1238

How would you achieve this in plain JavaScript? Please remember this is a non-DOM scenario, so jQuery and other solutions involving browser and keypress events aren't suitable.

12 Answers 12

1985

Use the string's .replace method with a regex of \D, which is a shorthand character class that matches all non-digits:

myString = myString.replace(/\D/g,'');
12
  • 10
    Thanks csj; anyplace to find more info on \D ?
    – p.campbell
    Commented Dec 7, 2009 at 19:55
  • 45
    This is my default regex reference: regular-expressions.info/reference.html The built-in character classes each have built-in complements. \d \D (digits versus everything but digits) \w \W (word charcters versus everything but word characters) \s \S (whitespace versus everything but whitespace)
    – csj
    Commented Dec 7, 2009 at 20:38
  • 6
    Just to be clear, here is the syntax for replace: w3schools.com/jsref/jsref_obj_regexp.asp because the forward slashes and the "g" are part of that command, not part of the RegEx.
    – Mike K
    Commented Feb 9, 2011 at 0:17
  • 2
    does replace work with this exact syntax in all browsers? seems like I remember getting an object has no method 'replace' in an older version of IE when using this with text I grabbed with jQuery... or something like that.
    – cwd
    Commented Feb 7, 2013 at 21:39
  • 2
    @cwd I have no idea what has been supported in past or current browsers. The question specified a non-DOM context, so it's likely that the poster was scripting in a non web browser environment.
    – csj
    Commented Feb 25, 2013 at 23:15
483

If you need this to leave the dot for float numbers, use this

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"
12
  • 12
    Any regexp experts? How to make this allow only a single dot (very relevant with numbers). Thanks!
    – Kasperi
    Commented Oct 21, 2014 at 14:48
  • 1
    what do you mean? give input and output example
    – max4ever
    Commented Oct 23, 2014 at 12:51
  • 4
    Not good: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9. Should strip any String which might surround a Number..
    – vsync
    Commented Jun 5, 2017 at 12:54
  • 3
    @max4ever you saved my life, thanks for handling -(negative) number case :) Commented Nov 30, 2017 at 17:14
  • 6
    @Kasperi perhaps: parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
    – A. Genedy
    Commented Feb 10, 2018 at 19:51
83

Use a regular expression, if your script implementation supports them. Something like:

myString.replace(/[^0-9]/g, '');
5
  • 26
    For some reason this way seems much more readable than [^\d]. Commented Sep 29, 2013 at 5:48
  • 1
    whats the g for after the regex delimiter?? Commented May 3, 2017 at 19:57
  • 3
    @NativeCoder stackoverflow.com/questions/12993629/…
    – RagnaRock
    Commented Nov 10, 2017 at 11:23
  • 1
    will not work for float/decimal values for example, "7.6$" will return 76 Commented Dec 10, 2020 at 12:58
  • 1
    like @SikandarTariq mentioned but also negative values.
    – skilleo
    Commented Aug 23, 2021 at 21:57
39

You can use a RegExp to replace all the non-digit characters:

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

Something along the lines of:

yourString = yourString.replace ( /[^0-9]/g, '' );
2
  • 19
    Not exactly an answer to the original question, but a version to handle the decimal point: yourString = yourString.replace ( /[^0-9.]/g, '' );
    – Maxim Mai
    Commented Jul 5, 2016 at 17:26
  • 1
    Late to the party but also need dash and comma. In certain regions decimal is done with a comma: replace(/[^0-9.,-]/g, '' Commented Mar 19, 2022 at 0:12
33

Short function to remove all non-numeric characters but keep the decimal (and return the number):

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

4
  • For me, this is better than the accepted answer, because it keeps the decimal.
    – Stefan
    Commented Feb 26, 2021 at 12:30
  • 1
    You might want to add "-" as well because the number can be negative as well. Commented Feb 27, 2021 at 18:39
  • ...but only if - is the first character Commented Oct 27, 2021 at 21:37
  • this does WRONG for the input my text: 9123.11, okay.?
    – Alexey Sh.
    Commented Feb 6 at 18:42
7

The problem with these answers above, is that it assumes whole numbers. But if you need a floating point value, then the previous reg string will remove the decimal point.

To correct this you need write a negated character class with ^

var mystring = mystring.replace(/[^0-9.]/g, '');
1
  • this does WRONG for the input my text: 9123.11 okay.
    – Alexey Sh.
    Commented Feb 6 at 18:42
4

In Angular / Ionic / VueJS -- I just came up with a simple method of:

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

Usage on the view:

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

Unfortunately none of the answers above worked for me.

I was looking to convert currency numbers from strings like $123,232,122.11 (1232332122.11) or USD 123,122.892 (123122.892) or any currency like ₹ 98,79,112.50 (9879112.5) to give me a number output including the decimal pointer.

Had to make my own regex which looks something like this:

str = str.match(/\d|\./g).join('');
1
  • this answer maintains the decimal places. Eg. "$19.00/month" is converted to "19.00"
    – abhishake
    Commented May 26 at 16:08
2

try

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

var myString = 'abc123.8<blah>'
console.log( myString.match(/\d/g).join`` );

5
  • how does this work?
    – 1252748
    Commented Dec 11, 2022 at 2:48
  • @1252748 match will filter all digits and put them into array, join will glue array elements into single string Commented Dec 11, 2022 at 19:37
  • i meant the join with the backticks. what's going on there?
    – 1252748
    Commented Dec 16, 2022 at 20:39
  • @1252748 read about: js tagged templates Commented Dec 16, 2022 at 21:25
  • Yeah I've seen tagged templates, just don't understand what is going on with join using them. Is this just saving two characters, invoking join with a single argument ""?
    – 1252748
    Commented Dec 20, 2022 at 3:32
1

This,

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

Handles both , and . also -

Example:

"Balance -$100,00.50".match(/\d|\.|\-/g).join('');

Outputs

-10000.50

-5

we are in 2017 now you can also use ES2016

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

or

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

The result is

1238
2
  • 14
    This is a very inefficient way to go about this operation.
    – djheru
    Commented Aug 10, 2017 at 16:02
  • 6
    It converts the string into an array of single-character strings via a spare method, and then applies filter function over JavaScript on each array item, returning a new string array, to finally join that array back into a string. Regex takes a string and returns a string and the processing is done via native code.
    – ShortFuse
    Commented Dec 18, 2018 at 23:03

Not the answer you're looking for? Browse other questions tagged or ask your own question.