2012-05-18 90 views
6

我需要從一個元素中獲取價格並將其添加到另一個元素。如何使用正則表達式的貨幣

我使用這個:

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

這似乎是工作了$0.50$1.00$20.00$200.00但我撞到南牆上$1,000.00和$ 10,000.00

(可能性不大$10,000.00將永遠不會使用) 。

逗號讓我絆倒。

**編輯**

我走了一個小時,回來的答案堆。在我經歷他們之前,我想我會澄清而不是回答所有評論:

正在使用的平臺會自動生成購物車中物品的總價值。它在一個元素中呈現 - 這取決於用戶是添加還是刪除項目。

由於產品成本並不高,因此價值不大可能達到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

+0

FYI正則表達式是JavaScript的,沒有特別的jQuery的一部分。 –

+1

什麼應該發生像$ 1.000,00'? –

+0

你不能在你的正則表達式中加入昏迷嗎? – jbduzan

回答

10

通過''更換non-digitnon-dot simbols,然後應用parseFloat

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

console.log(currencyValue) ; //1000.5 

UPDATE:如果你的 '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] 
+0

這實際上是最好的答案。如果您需要添加價格,最好轉換爲實際數字,然後重新格式化。 –

+0

他寫道,他需要從一個元素到另一個元素的價值,我不確定他可以解析價值。 – gdoron

+1

這將美元金額轉換爲數字值。這對於知道如何去做肯定是有用的。然而,這無助於他首先找到美元數額。 –

2

工作,這是爲我工作:

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

DEMO

我發現了一個優秀的正則表達式,它抓住每一個有效貨幣並且有點customed到您的需求:

/^\$[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

+1

這也會匹配'$ 0 ,,,,,。0'。 –

+0

@MarkByers。修正了,謝謝! – gdoron

+0

確定,但仍然匹配'$ 0,0,0,0.0'。 –

1

修改,以這樣的:

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

或本

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

我得到這一個:

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

只會匹配數字,不包括貨幣符號。

+0

實際上這個正則表達式是不正確的,因爲它匹配所有數字,而不是在開始時貨幣添加(?<= \ $) – Dmitry

+0

@Dmitry:我在我的答案中聲明我不匹配貨幣。他可能會在稍後改變他的貨幣,如果他沒有用RegEx來指出那個貨幣,那將是最好的。 –

+0

由於我stating yo正則表達式匹配「所有數字」,這並不意味着它只匹配貨幣的數字部分,例如這將匹配在「47號球員被買了100.00美元」字符串甚至47,顯然不是一個價格。 – Dmitry

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