【问题标题】:Strip all non-numeric characters from string in JavaScript从 JavaScript 中的字符串中去除所有非数字字符
【发布时间】:2010-12-24 03:27:51
【问题描述】:

考虑一个非 DOM 场景,您希望使用 JavaScript/ECMAScript 从字符串中删除所有非数字字符。应保留0 - 9 范围内的所有字符。

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

//desired output is 1238

您将如何在纯 JavaScript 中实现这一点?请记住这是一个非 DOM 场景,因此 jQuery 和其他涉及浏览器和按键事件的解决方案不适合。

【问题讨论】:

    标签: javascript string


    【解决方案1】:

    类似的东西:

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

    【讨论】:

    • 不完全是原始问题的答案,而是处理小数点的版本:yourString = yourString.replace ( /[^0-9.]/g, '' );
    【解决方案2】:

    您可以使用正则表达式来replace 所有非数字字符:

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

    【讨论】:

      【解决方案3】:

      如果您的脚本实现支持正则表达式,请使用它们。类似的东西:

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

      【讨论】:

      • 出于某种原因,这种方式似乎比 [^\d] 更具可读性。
      • 正则表达式分隔符后的 g 是什么??
      • 不适用于浮点/十进制值,例如,“7.6$”将返回 76
      • 像@SikandarTariq 提到的,但也有负值。
      【解决方案4】:

      将字符串的.replace 方法与\D 的正则表达式一起使用,这是匹配所有非数字的速记字符类:

      myString = myString.replace(/\D/g,'');
      

      【讨论】:

      • 谢谢csj;任何地方都可以找到更多关于\D 的信息?
      • 这是我的默认正则表达式参考:regular-expressions.info/reference.html 每个内置字符类都有内置补码。 \d \D(数字与除数字之外的所有内容)\w \W(单词字符与除单词字符之外的所有内容)\s \S(空格与除空格之外的所有内容)
      • 为了清楚起见,这里是替换的语法:w3schools.com/jsref/jsref_obj_regexp.asp 因为正斜杠和“g”是该命令的一部分,而不是 RegEx 的一部分。
      • replace 在所有浏览器中都能使用这种精确的语法吗?好像我记得在旧版本的 IE 中使用这个 object has no method 'replace' 我用 jQuery 抓取的文本......或类似的东西。
      • @cwd 我不知道过去或现在的浏览器支持什么。该问题指定了非 DOM 上下文,因此发帖人很可能是在非 Web 浏览器环境中编写脚本。
      【解决方案5】:

      如果你需要这个来为浮点数留下点,使用这个

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

      【讨论】:

      • 任何正则表达式专家?如何使它只允许一个点(与数字非常相关)。谢谢!
      • 什么意思?给出输入输出示例
      • 不好:"aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9. 应该剥离任何可能围绕数字的字符串..
      • @max4ever 你救了我的命,感谢您处理-(负) 数字情况:)
      • @Kasperi 也许:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
      【解决方案6】:

      我们在 2017 现在你也可以使用 ES2016

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

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

      结果是

      1238
      

      【讨论】:

      • 这是一种非常低效的操作方式。
      • 这里有什么低效或不好的地方?
      • 它通过备用方法将字符串转换为单字符串数组,然后对每个数组项应用 JavaScript 过滤函数,返回一个新的字符串数组,最后将该数组重新加入一个字符串。正则表达式接受一个字符串并返回一个字符串,并通过本机代码完成处理。
      【解决方案7】:

      试试

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

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

      【讨论】:

        【解决方案8】:

        在 Angular / Ionic / VueJS 中——我刚刚想出了一个简单的方法:

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

        在视图上的使用:

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

        【讨论】:

          【解决方案9】:

          不幸的是,以上答案都不适合我。

          我希望从 $123,232,122.11 (1232332122.11) 或 USD 123,122.892 (123122.892) 之类的字符串或 ₹ 98,79,112.50 (9879112.5) 之类的任何货币中转换货币数字,以给我一个数字输出,包括十进制指针。

          必须制作我自己的正则表达式,看起来像这样:

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

          【讨论】:

            【解决方案10】:

            删除所有非数字字符但保留小数(并返回数字)的短函数:

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

            【讨论】:

            • 对我来说,这比接受的答案要好,因为它保留了小数点。
            • 您可能还想加上“-”,因为这个数字也可以是负数。
            • ...但前提是- 是第一个字符
            【解决方案11】:

            这个,

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

            同时处理 ,. 以及 -

            例子:

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

            输出

            10000.50

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-10-21
              • 2011-09-13
              • 2011-04-28
              • 1970-01-01
              相关资源
              最近更新 更多