Skip to content

Commit 1616211

Browse files
committed
fix: disable zero-padding for special values in formatInterpolate
--- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: passed - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: na - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
1 parent b9e9eca commit 1616211

File tree

4 files changed

+81
-18
lines changed

4 files changed

+81
-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: 60 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,18 @@ 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 = '%.*f';
686+
tokens = formatTokenize( str );
687+
actual = formatInterpolate( tokens, 4, NaN );
688+
expected = 'nan';
689+
t.strictEqual( actual, expected, 'returns expected output' );
690+
655691
t.end();
656692
});
657693

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

859+
str = '%10.10f %10.10f baz';
860+
tokens = formatTokenize( str );
861+
actual = formatInterpolate( tokens, PINF, NINF );
862+
expected = ' infinity -infinity baz';
863+
t.strictEqual( actual, expected, 'returns expected output' );
864+
865+
str = '%8.4f';
866+
tokens = formatTokenize( str );
867+
actual = formatInterpolate( tokens, NaN );
868+
expected = ' nan';
869+
t.strictEqual( actual, expected, 'returns expected output' );
870+
823871
t.end();
824872
});
825873

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

898+
str = '%-10.10f %10.10f baz';
899+
tokens = formatTokenize( str );
900+
actual = formatInterpolate( tokens, PINF, NINF );
901+
expected = 'infinity -infinity baz';
902+
t.strictEqual( actual, expected, 'returns expected output' );
903+
904+
str = '%-8.4f';
905+
tokens = formatTokenize( str );
906+
actual = formatInterpolate( tokens, NaN );
907+
expected = 'nan ';
908+
t.strictEqual( actual, expected, 'returns expected output' );
909+
850910
t.end();
851911
});
852912

0 commit comments

Comments
 (0)