Skip to content

Commit 5b217dd

Browse files
committed
Number: Fix integer and fraction formatter for small numbers like 1e-7
Fixes globalizejs#750
1 parent 57e551b commit 5b217dd

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

src/number/format/integer-fraction-digits.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ return function( number, minimumIntegerDigits, minimumFractionDigits, maximumFra
3535
number = round( number, { exponent: -maximumFractionDigits } );
3636
}
3737

38+
// Use toFixed( maximumFractionDigits ) to make sure small numbers like 1e-7 are displayed
39+
// using plain digits instead of scientific notation.
40+
// 1: Remove leading decimal zeros.
41+
// 2: Remove leading decimal separator.
42+
number = number.toFixed( maximumFractionDigits )
43+
.replace( /0+$/, "" ) /* 1 */
44+
.replace( /\.$/, "" ) /* 2 */;
45+
3846
// Minimum fraction digits
3947
if ( minimumFractionDigits ) {
4048
number = String( number ).split( "." );
@@ -43,10 +51,9 @@ return function( number, minimumIntegerDigits, minimumFractionDigits, maximumFra
4351
}
4452
} else {
4553
number = round( number );
54+
number = String( number );
4655
}
4756

48-
number = String( number );
49-
5057
// Minimum integer digits
5158
if ( minimumIntegerDigits ) {
5259
number = number.split( "." );

test/unit/number/format/integer-fraction-digits.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,11 @@ QUnit.test( "should handle inaccurate floating point arithmetics", function( ass
7474
assert.equal( formatIntegerFractionDigits( 0.00015, 1, 1, 4, round, null ), "0.0002" );
7575
});
7676

77+
// `2e-7` => `"2,e-7"` (#750)
78+
QUnit.test( "should handle small numbers", function( assert ) {
79+
assert.equal( formatIntegerFractionDigits( 2e-7, 1, 0, 10, round, null ), "0.0000002" );
80+
assert.equal( formatIntegerFractionDigits( 1e-20, 1, 0, 20, round, null ), "0.00000000000000000001" );
81+
assert.equal( formatIntegerFractionDigits( 9e-8, 1, 0, 7, round, null ), "0.0000001" );
82+
});
83+
7784
});

0 commit comments

Comments
 (0)