From 49d50c02d42b1eaead03c5a4e7256b77d085a7e3 Mon Sep 17 00:00:00 2001 From: Geert Weening Date: Thu, 5 Jun 2014 14:07:15 -0700 Subject: [PATCH] [FIX] decimal precision amount parsing - add non-grouping operator to regex - add tests to cover the problematic cases --- src/js/ripple/amount.js | 4 ++-- test/amount-test.js | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/js/ripple/amount.js b/src/js/ripple/amount.js index 6e257bb1..0e4f33d7 100644 --- a/src/js/ripple/amount.js +++ b/src/js/ripple/amount.js @@ -602,14 +602,14 @@ Amount.prototype.invert = function() { * \s* // any amount of whitespace * (-)? // optional dash * (\d+) // 1 or more digits - * (\.(\d*))? // optional . character with any amount of digits + * (?:\.(\d*))? // optional . character with any amount of digits * \s* // any amount of whitespace * ([a-f0-9]{40}|[a-z0-9]{3})? // optional 40 character hex string OR 3 letters * \s* // any amount of whitespace * $ // end of string * */ -Amount.human_RE = /^\s*([a-z]{3}|[0-9]{3})?\s*(-)?(\d+)(\.(\d*))?\s*([a-f0-9]{40}|[a-z0-9]{3})?\s*$/i; +Amount.human_RE = /^\s*([a-z]{3}|[0-9]{3})?\s*(-)?(\d+)(?:\.(\d*))?\s*([a-f0-9]{40}|[a-z0-9]{3})?\s*$/i; Amount.prototype.parse_human = function(j, opts) { opts = opts || {}; diff --git a/test/amount-test.js b/test/amount-test.js index 26ec9fc7..93ab0093 100644 --- a/test/amount-test.js +++ b/test/amount-test.js @@ -16,6 +16,22 @@ describe('Amount', function() { assert(Amount.from_json('1').is_positive()); }); }); + describe('from_human', function() { + it('1 XRP', function() { + assert.strictEqual(Amount.from_human("1 XRP").to_text_full(), '1/XRP'); + }); + it('0.1 XRP', function() { + assert.strictEqual(Amount.from_human("0.1 XRP").to_text_full(), '0.1/XRP'); + }); + it('0.1 USD', function() { + assert.strictEqual(Amount.from_human("0.1 USD").to_text_full(), '0.1/USD/NaN'); + }); + }); + describe('from_json', function() { + it('1 XRP', function() { + assert.strictEqual(Amount.from_json("1/XRP").to_text_full(), "1/XRP/NaN"); + }); + }); describe('from_number', function() { it('Number 1', function() { assert.strictEqual(Amount.from_number(1).to_text_full(), '1/1/rrrrrrrrrrrrrrrrrrrrBZbvji');