【问题标题】:How to use regex for currency如何将正则表达式用于货币
【发布时间】:2012-05-25 19:37:14
【问题描述】:

我需要从一个元素中获取价格并将其添加到另一个元素。

我正在使用这个:

\$\d+(?:\.\d+)?

这似乎适用于$0.50$1.00$20.00$200.00,但我在$1,000.00 和 $10,000.00 上碰壁了

(不太可能使用$10,000.00)。

逗号把我绊倒了。

** 编辑 **

我离开了一个小时才回到一堆答案。在我浏览它们之前,我想我会澄清而不是回答所有 cmets:

所使用的平台会自动生成购物车中商品的总价值。它在一个元素中呈现 - 这取决于用户是添加还是删除项目。

价值不太可能进入10,000.00,因为产品成本并不高。

我不熟悉使用正则表达式,我花了足够长的时间才走到这一步,因此提出了问题。

自动生成的 HTML:

<span vertical="False" quote="False" id="catCartSummary">
   <table cellspacing="0" class="cartSummaryTable">
     <tbody>
       <tr>
         <td class="cartSummaryItem">3 item(s), Total: $115.00 <a href="#" class="cartSummaryLink">View Cart</a></td>
       </tr>
     </tbody>
   </table>
</span>

在这种情况下,我只需要 $115.00 美元的价值 - 但我需要它以 1,000.00 美元的价格工作

【问题讨论】:

  • 仅供参考 正则表达式是 javascript 的一部分,而不是 jQuery。
  • $1.000,00 这样的东西会发生什么?
  • 你不能在你的正则表达式中添加一个逗号吗?
  • @jbduzan:大概不会,否则我猜他不会问怎么做。
  • 你得到了两个很好的答案,这取决于你想要什么,解析值或抓取值。

标签: javascript jquery regex


【解决方案1】:

non-digitnon-dot 符号替换为'',然后应用parseFloat

var currencyValue = parseFloat("$1,000.50".replace(/[^\d\.]/g,''));

console.log( currencyValue ) ;   //1000.5

更新:如果您的“HTML 自动生成器”生成有效的货币字符串,那么

/\$\S+/g

正则表达式就足够了,提取所有货币:

var currencies = $('#cartSummaryItem').text().match(/\$\S+/g);    // ["$115.00"]

然后您可以将它们转换为数字以对它们进行数学运算:

var currenciesAsNumbers = currencies.map( function(item){
    return parseFloat( item.replace(/[^\d\.]/g,'') );
});    // [115]

【讨论】:

  • 这其实是最好的答案。如果您需要添加价格,最好转换为实际数字,然后重新格式化。
  • 他写道他需要将值从一个元素抓取到另一个元素,我不确定他是否可以解析该值。
  • 这会将美元金额转换为数值。知道如何做这当然很有用。然而,这并不能帮助他首先找到美元金额。
  • @gdoron 这并不明显,OP 的“添加到另一个”短语是什么意思。您的答案抓住了价值,我的答案将货币转换为数字以对其执行数学运算(特别是“添加”操作)。
  • @Engineer - 这非常适合我的工作,谢谢。
【解决方案2】:

这对我有用:

/\$\d+(,\d+)*(?:\.\d+)?/g

DEMO

我发现了一个出色的正则表达式,它可以抓取每一种有效货币,并根据您的需要对其进行了一些定制:

/^\$[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$/g

DEMO

The source of the regex

【讨论】:

  • 这也将匹配$0,,,,,.0
  • 好的,但仍然匹配$0,0,0,0.0
  • @MarkByers。这不是一个有效的输入??
  • 好吧,从问题中很难说出有效输入是什么,因为问题不清楚。我在评论中向 OP 询问了一个可能的有效/无效输入,但他没有回复。如果这将用于任何重要的事情,那么我希望看到模棱两可或不确定的输入被拒绝。
  • @gdoron - 这是一个有趣的正则表达式。你说你“找到”了——你有网址吗?
【解决方案3】:

修改如下:

\$(?:\d{1,3},)*\d+(?:\.\d+)?

或者这个

 \$\d{1,3}(,\d{3})*(?:\.\d+)?

【讨论】:

    【解决方案4】:
    var re = /^\d{1,3}(\,\d{3})*(?:\.\d+)?$/;
    
    console.log(re.test('0.50'));
    console.log(re.test('1'));
    console.log(re.test('20.50'));
    console.log(re.test('200.50'));
    console.log(re.test('2,000'));
    console.log(re.test('2,000.50'));
    console.log(re.test('20,000'));
    console.log(re.test('20,000.00'));
    console.log(re.test('1,000,000'));
    console.log(re.test('1,000,000.50'));
    

    【讨论】:

      【解决方案5】:

      去掉$货币符号和逗号很容易 使用此 RegEx 实现替换:[^.0-9]

      此处提供演示: http://rubular.com/r/Gwkx62RtLa

      【讨论】:

        【解决方案6】:

        我得到了这个:

        ^\d{1,3}(,\d{3})*(\.\d+)?$
        

        将仅匹配数字,不包括货币符号。

        【讨论】:

        • 实际上这个正则表达式是不正确的,因为它匹配所有数字,而不仅仅是货币添加 (?
        • @Dmitry:我在回答中已经说过我与货币不符。他以后可能想改变他的货币,最好不要用 RegEx 解决这个问题。
        • 正如我所说的 yuo 正则表达式匹配“所有数字”,这并不意味着它只匹配货币的数字部分,例如,这将匹配“47 号以下的玩家以 100.00 美元购买” string 甚至 47,这显然不是一个价格。
        猜你喜欢
        • 2012-11-30
        • 2010-10-23
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多