Skip to content

Commit b3c2d12

Browse files
fix: disable zero-padding for special values in string/base/format-interpolate
PR-URL: #6957 Reviewed-by: Athan Reines <[email protected]>
1 parent 33a4074 commit b3c2d12

File tree

4 files changed

+93
-18
lines changed

4 files changed

+93
-18
lines changed

lib/node_modules/@stdlib/string/base/format-interpolate/lib/format_double.js

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020

2121
// MODULES //
2222

23-
var isNumber = require( './is_number.js' );
24-
2523
// NOTE: for the following, we explicitly avoid using stdlib packages in this particular package in order to avoid circular dependencies.
2624
var abs = Math.abs; // eslint-disable-line stdlib/no-builtin-math
2725
var lowercase = String.prototype.toLowerCase;
@@ -46,21 +44,15 @@ var RE_ZERO_BEFORE_EXP = /(\..*[^0])0*e/;
4644
* Formats a token object argument as a floating-point number.
4745
*
4846
* @private
47+
* @param {number} f - parsed number
4948
* @param {Object} token - token object
5049
* @throws {Error} must provide a valid floating-point number
5150
* @returns {string} formatted token argument
5251
*/
53-
function formatDouble( token ) {
52+
function formatDouble( f, token ) {
5453
var digits;
5554
var out;
56-
var f = parseFloat( token.arg );
57-
if ( !isFinite( f ) ) { // NOTE: We use the global `isFinite` function here instead of `@stdlib/math/base/assert/is-finite` in order to avoid circular dependencies.
58-
if ( !isNumber( token.arg ) ) {
59-
throw new Error( 'invalid floating-point number. Value: ' + out );
60-
}
61-
// Case: NaN, Infinity, or -Infinity
62-
f = token.arg;
63-
}
55+
6456
switch ( token.specifier ) {
6557
case 'e':
6658
case 'E':

lib/node_modules/@stdlib/string/base/format-interpolate/lib/main.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
var formatInteger = require( './format_integer.js' );
2424
var isString = require( './is_string.js' );
25+
var isNumber = require( './is_number.js' );
2526
var formatDouble = require( './format_double.js' );
2627
var spacePad = require( './space_pad.js' );
2728
var zeroPad = require( './zero_pad.js' );
@@ -96,6 +97,7 @@ function formatInterpolate( tokens ) {
9697
var num;
9798
var out;
9899
var pos;
100+
var f;
99101
var i;
100102
var j;
101103

@@ -205,7 +207,16 @@ function formatInterpolate( tokens ) {
205207
if ( !hasPeriod ) {
206208
token.precision = 6;
207209
}
208-
token.arg = formatDouble( token );
210+
f = parseFloat( token.arg );
211+
if ( !isFinite( f ) ) { // NOTE: We use the global `isFinite` function here instead of `@stdlib/math/base/assert/is-finite` in order to avoid circular dependencies.
212+
if ( !isNumber( token.arg ) ) {
213+
throw new Error( 'invalid floating-point number. Value: ' + out );
214+
}
215+
// Case: NaN, Infinity, or -Infinity
216+
f = token.arg;
217+
token.padZeros = false;
218+
}
219+
token.arg = formatDouble( f, token );
209220
break;
210221
default:
211222
throw new Error( 'invalid specifier: ' + token.specifier );

lib/node_modules/@stdlib/string/base/format-interpolate/test/test.format_double.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ tape( 'the function returns a double-formatted token argument', function test( t
4444
'precision': 2
4545
};
4646
expected = '3.14';
47-
actual = formatDouble( token );
47+
actual = formatDouble( PI, token );
4848
t.strictEqual( actual, expected, 'returns expected value' );
4949

5050
token = {
@@ -53,7 +53,7 @@ tape( 'the function returns a double-formatted token argument', function test( t
5353
'precision': 4
5454
};
5555
expected = '3.1416';
56-
actual = formatDouble( token );
56+
actual = formatDouble( PI, token );
5757
t.strictEqual( actual, expected, 'returns expected value' );
5858

5959
token = {
@@ -62,7 +62,7 @@ tape( 'the function returns a double-formatted token argument', function test( t
6262
'precision': 2
6363
};
6464
expected = '3.14e+00';
65-
actual = formatDouble( token );
65+
actual = formatDouble( PI, token );
6666
t.strictEqual( actual, expected, 'returns expected value' );
6767

6868
token = {
@@ -71,7 +71,7 @@ tape( 'the function returns a double-formatted token argument', function test( t
7171
'precision': 2
7272
};
7373
expected = '3.14E+00';
74-
actual = formatDouble( token );
74+
actual = formatDouble( PI, token );
7575
t.strictEqual( actual, expected, 'returns expected value' );
7676

7777
t.end();
@@ -89,7 +89,7 @@ tape( 'the function returns a double-formatted token argument (include sign)', f
8989
'sign': '+'
9090
};
9191
expected = '+3.14';
92-
actual = formatDouble( token );
92+
actual = formatDouble( PI, token );
9393
t.strictEqual( actual, expected, 'returns expected value' );
9494

9595
token = {
@@ -99,7 +99,7 @@ tape( 'the function returns a double-formatted token argument (include sign)', f
9999
'sign': '-'
100100
};
101101
expected = '-3.1416';
102-
actual = formatDouble( token );
102+
actual = formatDouble( PI, token );
103103
t.strictEqual( actual, expected, 'returns expected value' );
104104

105105
t.end();

lib/node_modules/@stdlib/string/base/format-interpolate/test/test.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,30 @@ tape( 'the function returns a formatted string (`f` specifier, specified precisi
625625
expected = 'beep 5.000';
626626
t.strictEqual( actual, expected, 'returns expected output' );
627627

628+
str = '%.10f %.10f baz';
629+
tokens = formatTokenize( str );
630+
actual = formatInterpolate( tokens, PINF, NINF );
631+
expected = 'infinity -infinity baz';
632+
t.strictEqual( actual, expected, 'returns expected output' );
633+
634+
str = '%0.10f %0.10f baz';
635+
tokens = formatTokenize( str );
636+
actual = formatInterpolate( tokens, PINF, NINF );
637+
expected = 'infinity -infinity baz';
638+
t.strictEqual( actual, expected, 'returns expected output' );
639+
640+
str = '%.4f';
641+
tokens = formatTokenize( str );
642+
actual = formatInterpolate( tokens, NaN );
643+
expected = 'nan';
644+
t.strictEqual( actual, expected, 'returns expected output' );
645+
646+
str = '%0.4f';
647+
tokens = formatTokenize( str );
648+
actual = formatInterpolate( tokens, NaN );
649+
expected = 'nan';
650+
t.strictEqual( actual, expected, 'returns expected output' );
651+
628652
t.end();
629653
});
630654

@@ -652,6 +676,30 @@ tape( 'the function returns a formatted string (`f` specifier, variable precisio
652676
expected = '3.142 3.142 baz';
653677
t.strictEqual( actual, expected, 'returns expected output' );
654678

679+
str = '%.*f %.*f baz';
680+
tokens = formatTokenize( str );
681+
actual = formatInterpolate( tokens, 10, PINF, 10, NINF );
682+
expected = 'infinity -infinity baz';
683+
t.strictEqual( actual, expected, 'returns expected output' );
684+
685+
str = '%0.*f %0.*f baz';
686+
tokens = formatTokenize( str );
687+
actual = formatInterpolate( tokens, 10, PINF, 10, NINF );
688+
expected = 'infinity -infinity baz';
689+
t.strictEqual( actual, expected, 'returns expected output' );
690+
691+
str = '%.*f';
692+
tokens = formatTokenize( str );
693+
actual = formatInterpolate( tokens, 4, NaN );
694+
expected = 'nan';
695+
t.strictEqual( actual, expected, 'returns expected output' );
696+
697+
str = '%0.*f';
698+
tokens = formatTokenize( str );
699+
actual = formatInterpolate( tokens, 4, NaN );
700+
expected = 'nan';
701+
t.strictEqual( actual, expected, 'returns expected output' );
702+
655703
t.end();
656704
});
657705

@@ -820,6 +868,18 @@ tape( 'the function returns a formatted string (`f` specifier, minimum width, de
820868
expected = ' 3.140 5.000 baz';
821869
t.strictEqual( actual, expected, 'returns expected output' );
822870

871+
str = '%10.10f %10.10f baz';
872+
tokens = formatTokenize( str );
873+
actual = formatInterpolate( tokens, PINF, NINF );
874+
expected = ' infinity -infinity baz';
875+
t.strictEqual( actual, expected, 'returns expected output' );
876+
877+
str = '%8.4f';
878+
tokens = formatTokenize( str );
879+
actual = formatInterpolate( tokens, NaN );
880+
expected = ' nan';
881+
t.strictEqual( actual, expected, 'returns expected output' );
882+
823883
t.end();
824884
});
825885

@@ -847,6 +907,18 @@ tape( 'the function returns a formatted string (`f` specifier, minimum width, le
847907
expected = '3.140 5.000 baz';
848908
t.strictEqual( actual, expected, 'returns expected output' );
849909

910+
str = '%-10.10f %10.10f baz';
911+
tokens = formatTokenize( str );
912+
actual = formatInterpolate( tokens, PINF, NINF );
913+
expected = 'infinity -infinity baz';
914+
t.strictEqual( actual, expected, 'returns expected output' );
915+
916+
str = '%-8.4f';
917+
tokens = formatTokenize( str );
918+
actual = formatInterpolate( tokens, NaN );
919+
expected = 'nan ';
920+
t.strictEqual( actual, expected, 'returns expected output' );
921+
850922
t.end();
851923
});
852924

0 commit comments

Comments
 (0)