我有一个函数接受一个输入,一个数组,可以有X个值。我有一个字符串,表示所需的最终格式。
示例:
function doFormat(args) {
const format = 'Foo \\d{1,2}x\\d{2} Bar';
}
doFormat([123, 2, 3]);
我们假设,目前format
只包含与\\d
匹配的正则表达式模式,并且输入只包含数字。
在此特定示例中,我想根据Foo 12x02 Bar
变量的要求将输入args强制转换为字符串format
,因为\\d{1,2}
的第一个匹配将其限制为整数最大长度为2(因此修剪第一个输入,从123
到12
),\\d{2}
的第二个匹配限制为长度恰好为2的整数(因此填充第二个输入,从2
到02
)。我们删除3
的第三个输入,因为它未在format
中使用。
我怎样才能做到这一点?我在服务器上运行的Node脚本中使用它,所以如果需要,我可以使用任何NPM包。
答案 0 :(得分:1)
我创建了名为to-fmt
的npm包,它使用文字模板生成新的字符串渲染器函数。
对于你的情况,它可以这样工作:
import f from 'to-fmt';
// Number formatter function
const num = (...args) => value => {
let start;
let end;
const str = String(value);
if (args.length > 1) {
start = args[0];
end = start + args[1];
}
else if (args.length) {
start = 1;
end = 1 + args[0];
}
else {
start = 1;
end = str.length;
}
const len = end - start;
return str.slice(start - 1, end - 1)
.padStart(len, '0')
.slice(-len);
};
// Create new format:
const format = f`Foo ${num(1, 2)}x${num(2)} Bar`;
format(123, 2, 3); // -> 'Foo 12x02 Bar'
// And if you want to pass an Array
format(...[123, 2, 3]); // -> 'Foo 12x02 Bar'
使用template literal可以创建自定义字符串格式化程序(以及您想要的任何内容)。提供的包用它来产生新的功能。它要求占位符是一个可以将值转换为字符串的函数。