客户端的 sprintf 等价物 JavaScript
sprintf equivalent for client-side JavaScript
我知道 console.log
至少支持来自 C 的 printf
的一些基本特性,但我很好奇一种利用 console.log
的方法' s 实现创建类似于 sprintf
的内容。我知道你不能简单地使用 .bind
或 .apply
因为 console.log
实际上不是 return 字符串,所以有没有办法解决这个问题?
如果这实际上不可能,是否有其他鲜为人知的原生实现,只需几行代码即可在 JavaScript 中实现 sprintf
?
对于那些不知道 sprintf
到底是什么的人,here is some documentation from tutorialspoint。我正在寻找的示例用法如下:
var string1 = sprintf("Hello, %s!", "world");
var string2 = sprintf("The answer to everything is %d.", 42);
尝试利用 eval
, .replace
var sprintf = function sprintf() {
// arguments
var args = Array.prototype.slice.call(arguments)
// parameters for string
, n = args.slice(1, -1)
// string
, text = args[0]
// check for `Number`
, _res = isNaN(parseInt(args[args.length - 1]))
? args[args.length - 1]
// alternatively, if string passed
// as last argument to `sprintf`,
// `eval(args[args.length - 1])`
: Number(args[args.length - 1])
// array of replacement values
, arr = n.concat(_res)
// `res`: `text`
, res = text;
// loop `arr` items
for (var i = 0; i < arr.length; i++) {
// replace formatted characters within `res` with `arr` at index `i`
res = res.replace(/%d|%s/, arr[i])
}
// return string `res`
return res
};
document.write(sprintf("%d plus %d is %d", 0, 1, 0 + 1)
+ "<br>"
+ sprintf("Hello, %s!", "world")
+ "<br>"
+ sprintf("The answer to everything is %d.", 42)
);
保持简单
var sprintf = (str, ...argv) => !argv.length ? str :
sprintf(str = str.replace(sprintf.token||"$", argv.shift()), ...argv);
由于 Javascript 自动处理数据类型,因此不需要类型选项。
如果需要填充,"15".padStart(5,"0")
= ("00000"+15).slice(-5)
= "00015"
.
用法
var sprintf = (str, ...argv) => !argv.length ? str :
sprintf(str = str.replace(sprintf.token||"$", argv.shift()), ...argv);
alert(sprintf("Success after $ clicks ($ seconds).", 15, 4.569));
sprintf.token = "_";
alert(sprintf("Failure after _ clicks (_ seconds).", 5, 1.569));
sprintf.token = "%";
var a = "%<br>%<br>%";
var b = sprintf("% plus % is %", 0, 1, 0 + 1);
var c = sprintf("Hello, %!", "world");
var d = sprintf("The answer to everything is %.", 42);
document.write(sprintf(a,b,c,d));
我知道 console.log
至少支持来自 C 的 printf
的一些基本特性,但我很好奇一种利用 console.log
的方法' s 实现创建类似于 sprintf
的内容。我知道你不能简单地使用 .bind
或 .apply
因为 console.log
实际上不是 return 字符串,所以有没有办法解决这个问题?
如果这实际上不可能,是否有其他鲜为人知的原生实现,只需几行代码即可在 JavaScript 中实现 sprintf
?
对于那些不知道 sprintf
到底是什么的人,here is some documentation from tutorialspoint。我正在寻找的示例用法如下:
var string1 = sprintf("Hello, %s!", "world");
var string2 = sprintf("The answer to everything is %d.", 42);
尝试利用 , eval
.replace
var sprintf = function sprintf() {
// arguments
var args = Array.prototype.slice.call(arguments)
// parameters for string
, n = args.slice(1, -1)
// string
, text = args[0]
// check for `Number`
, _res = isNaN(parseInt(args[args.length - 1]))
? args[args.length - 1]
// alternatively, if string passed
// as last argument to `sprintf`,
// `eval(args[args.length - 1])`
: Number(args[args.length - 1])
// array of replacement values
, arr = n.concat(_res)
// `res`: `text`
, res = text;
// loop `arr` items
for (var i = 0; i < arr.length; i++) {
// replace formatted characters within `res` with `arr` at index `i`
res = res.replace(/%d|%s/, arr[i])
}
// return string `res`
return res
};
document.write(sprintf("%d plus %d is %d", 0, 1, 0 + 1)
+ "<br>"
+ sprintf("Hello, %s!", "world")
+ "<br>"
+ sprintf("The answer to everything is %d.", 42)
);
保持简单
var sprintf = (str, ...argv) => !argv.length ? str :
sprintf(str = str.replace(sprintf.token||"$", argv.shift()), ...argv);
由于 Javascript 自动处理数据类型,因此不需要类型选项。
如果需要填充,"15".padStart(5,"0")
= ("00000"+15).slice(-5)
= "00015"
.
用法
var sprintf = (str, ...argv) => !argv.length ? str :
sprintf(str = str.replace(sprintf.token||"$", argv.shift()), ...argv);
alert(sprintf("Success after $ clicks ($ seconds).", 15, 4.569));
sprintf.token = "_";
alert(sprintf("Failure after _ clicks (_ seconds).", 5, 1.569));
sprintf.token = "%";
var a = "%<br>%<br>%";
var b = sprintf("% plus % is %", 0, 1, 0 + 1);
var c = sprintf("Hello, %!", "world");
var d = sprintf("The answer to everything is %.", 42);
document.write(sprintf(a,b,c,d));