1013

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

    2002

    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 ?CommentedDec 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
      CommentedDec 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
      CommentedFeb 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
      CommentedFeb 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
      CommentedFeb 25, 2013 at 23:15
    487

    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
      CommentedOct 21, 2014 at 14:48
    • 1
      what do you mean? give input and output example
      – max4ever
      CommentedOct 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
      CommentedJun 5, 2017 at 12:54
    • 3
      @max4ever you saved my life, thanks for handling -(negative) number case :)CommentedNov 30, 2017 at 17:14
    • 6
      @Kasperi perhaps: parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
      – A. Genedy
      CommentedFeb 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].CommentedSep 29, 2013 at 5:48
    • 1
      whats the g for after the regex delimiter??CommentedMay 3, 2017 at 19:57
    • 3
      @NativeCoder stackoverflow.com/questions/12993629/…
      – RagnaRock
      CommentedNov 10, 2017 at 11:23
    • 1
      will not work for float/decimal values for example, "7.6$" will return 76CommentedDec 10, 2020 at 12:58
    • 1
      like @SikandarTariq mentioned but also negative values.
      – skilleo
      CommentedAug 23, 2021 at 21:57
    39

    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
      CommentedJul 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, ''CommentedMar 19, 2022 at 0:12
    39

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

    var myString = 'abc123.8<blah>'; myString = myString.replace(/[^\d]/g, ''); // 1238 
      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
      • For me, this is better than the accepted answer, because it keeps the decimal.
        – Stefan
        CommentedFeb 26, 2021 at 12:30
      • 1
        You might want to add "-" as well because the number can be negative as well.CommentedFeb 27, 2021 at 18:39
      • ...but only if - is the first characterCommentedOct 27, 2021 at 21:37
      • this does WRONG for the input my text: 9123.11, okay.?CommentedFeb 6, 2024 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, ''); 
      2
      • this does WRONG for the input my text: 9123.11 okay.CommentedFeb 6, 2024 at 18:42
      • The OP wants to remove decimals as well, so the regex should be /[^0-9]/g
        – Gavin
        CommentedAug 29, 2024 at 10:20
      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
          CommentedMay 26, 2024 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
          CommentedDec 11, 2022 at 2:48
        • @1252748 match will filter all digits and put them into array, join will glue array elements into single stringCommentedDec 11, 2022 at 19:37
        • i meant the join with the backticks. what's going on there?
          – 1252748
          CommentedDec 16, 2022 at 20:39
        • @1252748 read about: js tagged templatesCommentedDec 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
          CommentedDec 20, 2022 at 3:32
        2

        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
            CommentedAug 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
            CommentedDec 18, 2018 at 23:03

          Start asking to get answers

          Find the answer to your question by asking.

          Ask question

          Explore related questions

          See similar questions with these tags.