summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/api/util.md4
-rw-r--r--lib/util.js11
-rw-r--r--test/parallel/test-util-format.js16
3 files changed, 18 insertions, 13 deletions
diff --git a/doc/api/util.md b/doc/api/util.md
index 8b2e7d2e41..9c4c6cca40 100644
--- a/doc/api/util.md
+++ b/doc/api/util.md
@@ -184,6 +184,10 @@ property take precedence over `--trace-deprecation` and
added: v0.5.3
changes:
- version: REPLACEME
+ pr-url: https://github.com/nodejs/node/pull/23708
+ description: The `%d`, `%f` and `%i` specifiers now support Symbols
+ properly.
+ - version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/23162
description: The `format` argument is now only taken as such if it actually
contains format specifiers.
diff --git a/lib/util.js b/lib/util.js
index 22c2b260da..63b34f48bf 100644
--- a/lib/util.js
+++ b/lib/util.js
@@ -114,6 +114,8 @@ function formatWithOptions(inspectOptions, ...args) {
// eslint-disable-next-line valid-typeof
if (typeof tempNum === 'bigint') {
tempStr = `${tempNum}n`;
+ } else if (typeof tempNum === 'symbol') {
+ tempStr = 'NaN';
} else {
tempStr = `${Number(tempNum)}`;
}
@@ -136,12 +138,19 @@ function formatWithOptions(inspectOptions, ...args) {
// eslint-disable-next-line valid-typeof
if (typeof tempInteger === 'bigint') {
tempStr = `${tempInteger}n`;
+ } else if (typeof tempInteger === 'symbol') {
+ tempStr = 'NaN';
} else {
tempStr = `${parseInt(tempInteger)}`;
}
break;
case 102: // 'f'
- tempStr = `${parseFloat(args[a++])}`;
+ const tempFloat = args[a++];
+ if (typeof tempFloat === 'symbol') {
+ tempStr = 'NaN';
+ } else {
+ tempStr = `${parseFloat(tempFloat)}`;
+ }
break;
case 37: // '%'
str += first.slice(lastPos, i);
diff --git a/test/parallel/test-util-format.js b/test/parallel/test-util-format.js
index 2ca8e0857f..066b4de58c 100644
--- a/test/parallel/test-util-format.js
+++ b/test/parallel/test-util-format.js
@@ -44,18 +44,6 @@ assert.strictEqual(util.format(symbol), 'Symbol(foo)');
assert.strictEqual(util.format('foo', symbol), 'foo Symbol(foo)');
assert.strictEqual(util.format('%s', symbol), 'Symbol(foo)');
assert.strictEqual(util.format('%j', symbol), 'undefined');
-assert.throws(
- () => { util.format('%d', symbol); },
- (e) => {
- // The error should be a TypeError.
- if (!(e instanceof TypeError))
- return false;
-
- // The error should be from the JS engine and not from Node.js.
- // JS engine errors do not have the `code` property.
- return e.code === undefined;
- }
-);
// Number format specifier
assert.strictEqual(util.format('%d'), '%d');
@@ -66,6 +54,7 @@ assert.strictEqual(util.format('%d', '42.0'), '42');
assert.strictEqual(util.format('%d', 1.5), '1.5');
assert.strictEqual(util.format('%d', -0.5), '-0.5');
assert.strictEqual(util.format('%d', ''), '0');
+assert.strictEqual(util.format('%d', Symbol()), 'NaN');
assert.strictEqual(util.format('%d %d', 42, 43), '42 43');
assert.strictEqual(util.format('%d %d', 42), '42 %d');
assert.strictEqual(
@@ -90,6 +79,7 @@ assert.strictEqual(util.format('%i', '42.0'), '42');
assert.strictEqual(util.format('%i', 1.5), '1');
assert.strictEqual(util.format('%i', -0.5), '0');
assert.strictEqual(util.format('%i', ''), 'NaN');
+assert.strictEqual(util.format('%i', Symbol()), 'NaN');
assert.strictEqual(util.format('%i %i', 42, 43), '42 43');
assert.strictEqual(util.format('%i %i', 42), '42 %i');
assert.strictEqual(
@@ -125,6 +115,8 @@ assert.strictEqual(util.format('%f', 1.5), '1.5');
assert.strictEqual(util.format('%f', -0.5), '-0.5');
assert.strictEqual(util.format('%f', Math.PI), '3.141592653589793');
assert.strictEqual(util.format('%f', ''), 'NaN');
+assert.strictEqual(util.format('%f', Symbol('foo')), 'NaN');
+assert.strictEqual(util.format('%f', 5n), '5');
assert.strictEqual(util.format('%f %f', 42, 43), '42 43');
assert.strictEqual(util.format('%f %f', 42), '42 %f');