Skip to content

Commit 14c29f2

Browse files
committed
Number parser: Lenient about trailing decimal separator
Fixes globalizejs#744
1 parent e1b31cd commit 14c29f2

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

src/number/parse-properties.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,9 @@ return function( pattern, cldr, options ) {
121121
if ( !isNaN( minimumSignificantDigits * maximumSignificantDigits ) || /* 1 */
122122
maximumFractionDigits /* 2 */ ) {
123123

124+
// 1: Handle trailing decimal separator, e.g., `"1." => `1``.
124125
aux = decimalSymbolRe + digitsRe + "+";
125-
numberTokenizer = numberTokenizer + "(" + aux + ")?" +
126+
numberTokenizer = numberTokenizer + "(" + aux + "|" + decimalSymbolRe /* 1 */ + ")?" +
126127

127128
// Handle non-padded decimals, e.g., `".12"` => `0.12` by making the integer part
128129
// optional.

test/unit/number/parse-properties.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,26 +91,26 @@ QUnit.test( "should return negativeSuffix tokenizer", function( assert ) {
9191

9292
QUnit.test( "should return number tokenizer", function( assert ) {
9393
assert.deepEqual( properties( "0", en )[ 2 ].number, /^\d+/ );
94-
assert.deepEqual( properties( "0.##", en )[ 2 ].number, /^(\d+(\.\d+)?|(\d+)?\.\d+)/ );
94+
assert.deepEqual( properties( "0.##", en )[ 2 ].number, /^(\d+(\.\d+|\.)?|(\d+)?\.\d+)/ );
9595

9696
assert.deepEqual(
9797
properties( "#,##0.##", en )[ 2 ].number,
98-
/^((\d{1,3}(,\d{3})+|\d+)(\.\d+)?|((\d{1,3}(,\d{3})+|\d+))?\.\d+)/
98+
/^((\d{1,3}(,\d{3})+|\d+)(\.\d+|\.)?|((\d{1,3}(,\d{3})+|\d+))?\.\d+)/
9999
);
100100

101101
assert.deepEqual(
102102
properties( "#,##0.##", es )[ 2 ].number,
103-
/^((\d{1,3}(\.\d{3})+|\d+)(,\d+)?|((\d{1,3}(\.\d{3})+|\d+))?,\d+)/
103+
/^((\d{1,3}(\.\d{3})+|\d+)(,\d+|,)?|((\d{1,3}(\.\d{3})+|\d+))?,\d+)/
104104
);
105105

106106
assert.deepEqual(
107107
properties( "#,##,##0.##", en )[ 2 ].number,
108-
/^((\d{1,2}((,\d{2})*(,\d{3}))|\d+)(\.\d+)?|((\d{1,2}((,\d{2})*(,\d{3}))|\d+))?\.\d+)/
108+
/^((\d{1,2}((,\d{2})*(,\d{3}))|\d+)(\.\d+|\.)?|((\d{1,2}((,\d{2})*(,\d{3}))|\d+))?\.\d+)/
109109
);
110110

111111
assert.deepEqual(
112112
properties( "#,##0.##", sv )[ 2 ].number,
113-
/^((\d{1,3}( \d{3})+|\d+)(,\d+)?|((\d{1,3}( \d{3})+|\d+))?,\d+)/
113+
/^((\d{1,3}( \d{3})+|\d+)(,\d+|,)?|((\d{1,3}( \d{3})+|\d+))?,\d+)/
114114
);
115115
});
116116

test/unit/number/parse.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ QUnit.test( "should parse zero-padded decimals", function( assert ) {
109109
assert.equal( parse( "0.10", properties( "0.00", en ) ), 0.1 );
110110
});
111111

112+
QUnit.test( "should parse trailing decimal separator", function( assert ) {
113+
assert.equal( parse( "1.", properties( "0.0", en ) ), 1 );
114+
assert.equal( parse( "١٫", properties( "0.0", ar ) ), 1 );
115+
assert.equal( parse( "1,", properties( "0.0", pt ) ), 1 );
116+
});
117+
112118
QUnit.test( "should parse non-padded decimals", function( assert ) {
113119
assert.equal( parse( ".14159", properties( "0.0", en ) ), 0.14159 );
114120
assert.equal( parse( ".752", properties( "0.0", en ) ), 0.752 );

0 commit comments

Comments
 (0)