Skip to content

Commit 7af1ad0

Browse files
silverwindMylesBorins
authored andcommitted
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 00b2790 commit 7af1ad0

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
@@ -105,7 +105,9 @@ Each placeholder token is replaced with the converted value from the
105105
corresponding argument. Supported placeholders are:
106106

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

lib/util.js

+16
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,22 @@ exports.format = function(f) {
9191
str += Number(arguments[a++]);
9292
lastPos = i = i + 2;
9393
continue;
94+
case 105: // 'i'
95+
if (a >= argLen)
96+
break;
97+
if (lastPos < i)
98+
str += f.slice(lastPos, i);
99+
str += parseInt(arguments[a++]);
100+
lastPos = i = i + 2;
101+
continue;
102+
case 102: // 'f'
103+
if (a >= argLen)
104+
break;
105+
if (lastPos < i)
106+
str += f.slice(lastPos, i);
107+
str += parseFloat(arguments[a++]);
108+
lastPos = i = i + 2;
109+
continue;
94110
case 106: // 'j'
95111
if (a >= argLen)
96112
break;

test/parallel/test-util-format.js

+37-9
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,51 @@ assert.throws(function() {
2727
util.format('%d', symbol);
2828
}, /^TypeError: Cannot convert a Symbol value to a number$/);
2929

30+
// Number format specifier
31+
assert.strictEqual(util.format('%d'), '%d');
3032
assert.strictEqual(util.format('%d', 42.0), '42');
3133
assert.strictEqual(util.format('%d', 42), '42');
32-
assert.strictEqual(util.format('%s', 42), '42');
33-
assert.strictEqual(util.format('%j', 42), '42');
34-
35-
assert.strictEqual(util.format('%d', '42.0'), '42');
3634
assert.strictEqual(util.format('%d', '42'), '42');
37-
assert.strictEqual(util.format('%s', '42'), '42');
38-
assert.strictEqual(util.format('%j', '42'), '"42"');
35+
assert.strictEqual(util.format('%d', '42.0'), '42');
36+
assert.strictEqual(util.format('%d', 1.5), '1.5');
37+
assert.strictEqual(util.format('%d', -0.5), '-0.5');
38+
assert.strictEqual(util.format('%d', ''), '0');
3939

40-
assert.strictEqual(util.format('%%s%s', 'foo'), '%sfoo');
40+
// Integer format specifier
41+
assert.strictEqual(util.format('%i'), '%i');
42+
assert.strictEqual(util.format('%i', 42.0), '42');
43+
assert.strictEqual(util.format('%i', 42), '42');
44+
assert.strictEqual(util.format('%i', '42'), '42');
45+
assert.strictEqual(util.format('%i', '42.0'), '42');
46+
assert.strictEqual(util.format('%i', 1.5), '1');
47+
assert.strictEqual(util.format('%i', -0.5), '0');
48+
assert.strictEqual(util.format('%i', ''), 'NaN');
49+
50+
// Float format specifier
51+
assert.strictEqual(util.format('%f'), '%f');
52+
assert.strictEqual(util.format('%f', 42.0), '42');
53+
assert.strictEqual(util.format('%f', 42), '42');
54+
assert.strictEqual(util.format('%f', '42'), '42');
55+
assert.strictEqual(util.format('%f', '42.0'), '42');
56+
assert.strictEqual(util.format('%f', 1.5), '1.5');
57+
assert.strictEqual(util.format('%f', -0.5), '-0.5');
58+
assert.strictEqual(util.format('%f', Math.PI), '3.141592653589793');
59+
assert.strictEqual(util.format('%f', ''), 'NaN');
4160

61+
// String format specifier
4262
assert.strictEqual(util.format('%s'), '%s');
4363
assert.strictEqual(util.format('%s', undefined), 'undefined');
4464
assert.strictEqual(util.format('%s', 'foo'), 'foo');
65+
assert.strictEqual(util.format('%s', 42), '42');
66+
assert.strictEqual(util.format('%s', '42'), '42');
67+
68+
// JSON format specifier
69+
assert.strictEqual(util.format('%j'), '%j');
70+
assert.strictEqual(util.format('%j', 42), '42');
71+
assert.strictEqual(util.format('%j', '42'), '"42"');
72+
73+
// Various format specifiers
74+
assert.strictEqual(util.format('%%s%s', 'foo'), '%sfoo');
4575
assert.strictEqual(util.format('%s:%s'), '%s:%s');
4676
assert.strictEqual(util.format('%s:%s', undefined), 'undefined:%s');
4777
assert.strictEqual(util.format('%s:%s', 'foo'), 'foo:%s');
@@ -50,11 +80,9 @@ assert.strictEqual(util.format('%s:%s', 'foo', 'bar', 'baz'), 'foo:bar baz');
5080
assert.strictEqual(util.format('%%%s%%', 'hi'), '%hi%');
5181
assert.strictEqual(util.format('%%%s%%%%', 'hi'), '%hi%%');
5282
assert.strictEqual(util.format('%sbc%%def', 'a'), 'abc%def');
53-
5483
assert.strictEqual(util.format('%d:%d', 12, 30), '12:30');
5584
assert.strictEqual(util.format('%d:%d', 12), '12:%d');
5685
assert.strictEqual(util.format('%d:%d'), '%d:%d');
57-
5886
assert.strictEqual(util.format('o: %j, a: %j', {}, []), 'o: {}, a: []');
5987
assert.strictEqual(util.format('o: %j, a: %j', {}), 'o: {}, a: %j');
6088
assert.strictEqual(util.format('o: %j, a: %j'), 'o: %j, a: %j');

0 commit comments

Comments
 (0)