Skip to content

Commit 1ee38eb

Browse files
silverwinditaloacasas
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 5ac719d commit 1ee38eb

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
@@ -89,6 +89,22 @@ exports.format = function(f) {
8989
str += Number(arguments[a++]);
9090
lastPos = i = i + 2;
9191
continue;
92+
case 105: // 'i'
93+
if (a >= argLen)
94+
break;
95+
if (lastPos < i)
96+
str += f.slice(lastPos, i);
97+
str += parseInt(arguments[a++]);
98+
lastPos = i = i + 2;
99+
continue;
100+
case 102: // 'f'
101+
if (a >= argLen)
102+
break;
103+
if (lastPos < i)
104+
str += f.slice(lastPos, i);
105+
str += parseFloat(arguments[a++]);
106+
lastPos = i = i + 2;
107+
continue;
92108
case 106: // 'j'
93109
if (a >= argLen)
94110
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);
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)