ChatGPT解决这个技术问题 Extra ChatGPT

Strip all non-numeric characters from string in JavaScript

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.


c
csj

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,'');

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.
m
max4ever

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

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

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, ''))
A
Auraseer

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

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

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.
C
Christian C. Salvadó

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

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

J
Jan Hančič

Something along the lines of:

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

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, ''
j
jackosaur

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


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
G
Grant

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>

C
Chaos Legion

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

K
Kamil Kiełczewski

try

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

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


j
jeffbRTC

This,

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

Handles both , and . also -

Example:

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

Outputs

10000.50


D
Debbie Kurth

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, '');

F
Frank Wisniewski

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

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.