Skip to content

Commit a46c43d

Browse files
committed
util: add %i and %f formatting specifiers
This change brings formatting specifiers available in `util.format` and consequently, `console.*` closer to what is supported in all major browsers. - `%i` is introduced to format integer values. - `%f` is introduced to format floating point values. Fixes: #10292 PR-URL: #10308 Reviewed-By: James M Snell <[email protected]>
1 parent 1fde98b commit a46c43d

File tree

3 files changed

+56
-10
lines changed

3 files changed

+56
-10
lines changed

doc/api/util.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ Each placeholder token is replaced with the converted value from the
103103
corresponding argument. Supported placeholders are:
104104

105105
* `%s` - String.
106-
* `%d` - Number (both integer and float).
106+
* `%d` - Number (integer or floating point value).
107+
* `%i` - Integer.
108+
* `%f` - Floating point value.
107109
* `%j` - JSON. Replaced with the string `'[Circular]'` if the argument
108110
contains circular references.
109111
* `%%` - single percent sign (`'%'`). This does not consume an argument.

lib/util.js

+16
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,22 @@ exports.format = function(f) {
8686
str += Number(arguments[a++]);
8787
lastPos = i = i + 2;
8888
continue;
89+
case 105: // 'i'
90+
if (a >= argLen)
91+
break;
92+
if (lastPos < i)
93+
str += f.slice(lastPos, i);
94+
str += parseInt(arguments[a++]);
95+
lastPos = i = i + 2;
96+
continue;
97+
case 102: // 'f'
98+
if (a >= argLen)
99+
break;
100+
if (lastPos < i)
101+
str += f.slice(lastPos, i);
102+
str += parseFloat(arguments[a++]);
103+
lastPos = i = i + 2;
104+
continue;
89105
case 106: // 'j'
90106
if (a >= argLen)
91107
break;

test/parallel/test-util-format.js

+37-9
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,51 @@ assert.throws(function() {
4848
util.format('%d', symbol);
4949
}, TypeError);
5050

51+
// Number format specifier
52+
assert.strictEqual(util.format('%d'), '%d');
5153
assert.strictEqual(util.format('%d', 42.0), '42');
5254
assert.strictEqual(util.format('%d', 42), '42');
53-
assert.strictEqual(util.format('%s', 42), '42');
54-
assert.strictEqual(util.format('%j', 42), '42');
55-
56-
assert.strictEqual(util.format('%d', '42.0'), '42');
5755
assert.strictEqual(util.format('%d', '42'), '42');
58-
assert.strictEqual(util.format('%s', '42'), '42');
59-
assert.strictEqual(util.format('%j', '42'), '"42"');
56+
assert.strictEqual(util.format('%d', '42.0'), '42');
57+
assert.strictEqual(util.format('%d', 1.5), '1.5');
58+
assert.strictEqual(util.format('%d', -0.5), '-0.5');
59+
assert.strictEqual(util.format('%d', ''), '0');
6060

61-
assert.strictEqual(util.format('%%s%s', 'foo'), '%sfoo');
61+
// Integer format specifier
62+
assert.strictEqual(util.format('%i'), '%i');
63+
assert.strictEqual(util.format('%i', 42.0), '42');
64+
assert.strictEqual(util.format('%i', 42), '42');
65+
assert.strictEqual(util.format('%i', '42'), '42');
66+
assert.strictEqual(util.format('%i', '42.0'), '42');
67+
assert.strictEqual(util.format('%i', 1.5), '1');
68+
assert.strictEqual(util.format('%i', -0.5), '0');
69+
assert.strictEqual(util.format('%i', ''), 'NaN');
70+
71+
// Float format specifier
72+
assert.strictEqual(util.format('%f'), '%f');
73+
assert.strictEqual(util.format('%f', 42.0), '42');
74+
assert.strictEqual(util.format('%f', 42), '42');
75+
assert.strictEqual(util.format('%f', '42'), '42');
76+
assert.strictEqual(util.format('%f', '42.0'), '42');
77+
assert.strictEqual(util.format('%f', 1.5), '1.5');
78+
assert.strictEqual(util.format('%f', -0.5), '-0.5');
79+
assert.strictEqual(util.format('%f', Math.PI), '3.141592653589793');
80+
assert.strictEqual(util.format('%f', ''), 'NaN');
6281

82+
// String format specifier
6383
assert.strictEqual(util.format('%s'), '%s');
6484
assert.strictEqual(util.format('%s', undefined), 'undefined');
6585
assert.strictEqual(util.format('%s', 'foo'), 'foo');
86+
assert.strictEqual(util.format('%s', 42), '42');
87+
assert.strictEqual(util.format('%s', '42'), '42');
88+
89+
// JSON format specifier
90+
assert.strictEqual(util.format('%j'), '%j');
91+
assert.strictEqual(util.format('%j', 42), '42');
92+
assert.strictEqual(util.format('%j', '42'), '"42"');
93+
94+
// Various format specifiers
95+
assert.strictEqual(util.format('%%s%s', 'foo'), '%sfoo');
6696
assert.strictEqual(util.format('%s:%s'), '%s:%s');
6797
assert.strictEqual(util.format('%s:%s', undefined), 'undefined:%s');
6898
assert.strictEqual(util.format('%s:%s', 'foo'), 'foo:%s');
@@ -71,11 +101,9 @@ assert.strictEqual(util.format('%s:%s', 'foo', 'bar', 'baz'), 'foo:bar baz');
71101
assert.strictEqual(util.format('%%%s%%', 'hi'), '%hi%');
72102
assert.strictEqual(util.format('%%%s%%%%', 'hi'), '%hi%%');
73103
assert.strictEqual(util.format('%sbc%%def', 'a'), 'abc%def');
74-
75104
assert.strictEqual(util.format('%d:%d', 12, 30), '12:30');
76105
assert.strictEqual(util.format('%d:%d', 12), '12:%d');
77106
assert.strictEqual(util.format('%d:%d'), '%d:%d');
78-
79107
assert.strictEqual(util.format('o: %j, a: %j', {}, []), 'o: {}, a: []');
80108
assert.strictEqual(util.format('o: %j, a: %j', {}), 'o: {}, a: %j');
81109
assert.strictEqual(util.format('o: %j, a: %j'), 'o: %j, a: %j');

0 commit comments

Comments
 (0)