1018

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

2004

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,'');
Sign up to request clarification or add additional context in comments.

12 Comments

Thanks csj; anyplace to find more info on \D ?
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)
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.
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 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.
|
488

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

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

12 Comments

Any regexp experts? How to make this allow only a single dot (very relevant with numbers). Thanks!
what do you mean? give input and output example
Not good: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9. Should strip any String which might surround a Number..
@max4ever you saved my life, thanks for handling -(negative) number case :)
@Kasperi perhaps: parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
|
83

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

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

5 Comments

For some reason this way seems much more readable than [^\d].
whats the g for after the regex delimiter??
will not work for float/decimal values for example, "7.6$" will return 76
like @SikandarTariq mentioned but also negative values.
39

Something along the lines of:

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

2 Comments

Not exactly an answer to the original question, but a version to handle the decimal point: yourString = yourString.replace ( /[^0-9.]/g, '' );
Late to the party but also need dash and comma. In certain regions decimal is done with a comma: replace(/[^0-9.,-]/g, ''
39

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

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

Comments

34

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 Comments

For me, this is better than the accepted answer, because it keeps the decimal.
You might want to add "-" as well because the number can be negative as well.
...but only if - is the first character
this does WRONG for the input my text: 9123.11, okay.?
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, '');

2 Comments

this does WRONG for the input my text: 9123.11 okay.
The OP wants to remove decimals as well, so the regex should be /[^0-9]/g
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>

Comments

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 Comment

this answer maintains the decimal places. Eg. "$19.00/month" is converted to "19.00"
3

This,

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

Handles both , and . also -

Example:

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

Outputs

-10000.50

Comments

2

try

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

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

5 Comments

how does this work?
@1252748 match will filter all digits and put them into array, join will glue array elements into single string
i meant the join with the backticks. what's going on there?
@1252748 read about: js tagged templates
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 ""?
-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 Comments

This is a very inefficient way to go about this operation.
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.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.