Reputation: 329
I need to grab a price from one element and add it to another.
I am using this:
\$\d+(?:\.\d+)?
Which seems to work for $0.50
, $1.00
, $20.00
, $200.00
but I hit a brick wall on $1,000.00
and $10,000.00
(Unlikely $10,000.00
will ever be used).
The comma is tripping me up.
** Edit **
I went away for an hour to come back to heaps of answers. Before I go through them I thought I'd clarify rather than answering all comments:
The platform being used auto generates the total value of items in a shopping cart. It gets rendered in a an element - this changes depending on whether a user is adding or removing items.
The value is unlikely to go into 10,000.00 because the product costs are not that high.
I am new to using the regex it took me long enough to get this far, hence the question.
Auto generated 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>
I just need the $ value in this case $115.00 - But I need it to work for $1,000.00
Upvotes: 6
Views: 19292
Reputation: 11
Stripping out $ currency symbol as well as the comma can be easily achieved with this RegEx using replace: [^.0-9]
Demo available here: http://rubular.com/r/Gwkx62RtLa
Upvotes: 1
Reputation: 150253
This is working for me:
/\$\d+(,\d+)*(?:\.\d+)?/g
I found an excellent regex that grabs every valid currency and customed it a bit to your needs:
/^\$[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$/g
Upvotes: 2
Reputation: 48793
Replace non-digit
and non-dot
simbols by ''
, then apply parseFloat
:
var currencyValue = parseFloat("$1,000.50".replace(/[^\d\.]/g,''));
console.log( currencyValue ) ; //1000.5
UPDATE: If your 'HTML Auto generator' generates valid currency strings, then
/\$\S+/g
regexp is enough, for extracting all currencies:
var currencies = $('#cartSummaryItem').text().match(/\$\S+/g); // ["$115.00"]
Then you could convert them to numbers for performing maths on them:
var currenciesAsNumbers = currencies.map( function(item){
return parseFloat( item.replace(/[^\d\.]/g,'') );
}); // [115]
Upvotes: 11
Reputation: 123377
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'));
Upvotes: 1
Reputation: 174957
I got this one:
^\d{1,3}(,\d{3})*(\.\d+)?$
Will match the number only, not including the currency symbol.
Upvotes: 0
Reputation: 1283
Modify to something like this:
\$(?:\d{1,3},)*\d+(?:\.\d+)?
or this
\$\d{1,3}(,\d{3})*(?:\.\d+)?
Upvotes: 1