在JavaScript中推荐的零填充方法是什么?我想我可以构建一个自定义函数来填充零到类型转换的值,但我想知道是否有更直接的方法来做到这一点?
注意:这里的“zeroffilled”指的是数据库意义上的单词(其中数字5的6位零填充表示形式将是“000005”)。
在JavaScript中推荐的零填充方法是什么?我想我可以构建一个自定义函数来填充零到类型转换的值,但我想知道是否有更直接的方法来做到这一点?
注意:这里的“zeroffilled”指的是数据库意义上的单词(其中数字5的6位零填充表示形式将是“000005”)。
当前回答
不幸的是,对于这个问题,有很多不必要的复杂建议,通常涉及编写自己的函数来进行数学运算或字符串操作或调用第三方实用程序。但是,在基本JavaScript库中有一种标准的方法,只需一行代码就可以做到这一点。将这一行代码打包到一个函数中可能是值得的,以避免必须指定您永远不想更改的参数,如本地名称或样式。
var amount = 5;
var text = amount.toLocaleString('en-US',
{
style: 'decimal',
minimumIntegerDigits: 3,
useGrouping: false
});
这将为文本生成值“005”。还可以使用Number的toLocaleString函数将零填充到小数点的右侧。
var amount = 5;
var text = amount.toLocaleString('en-US',
{
style: 'decimal',
minimumFractionDigits: 2,
useGrouping: false
});
这将为文本生成值“5.00”。将useGrouping更改为true以使用逗号分隔千位。
请注意,使用带有locale和options参数的toLocaleString()在ECMA-402中是单独标准化的,而不是在ECMAScript中。到目前为止,一些浏览器只实现了基本的支持,即toLocaleString()可能会忽略任何参数。
完整的示例
其他回答
这个方法不是更快,但它相当原生。
zeroPad = function (num, count) {
return [Math.pow(10, count - num.toString().length), num].join('').substr(1);
};
我对这个话题的一点贡献(https://gist.github.com/lucasferreira/a881606894dde5568029):
/* Autor: Lucas Ferreira - http://blog.lucasferreira.com | Usage: fz(9) or fz(100, 7) */
function fz(o, s) {
for(var s=Math.max((+s||2),(n=""+Math.abs(o)).length); n.length<s; (n="0"+n));
return (+o < 0 ? "-" : "") + n;
};
用法:
fz(9) & fz(9, 2) == "09"
fz(-3, 2) == "-03"
fz(101, 7) == "0000101"
我知道,这是一个很脏的函数,但它很快,即使是负数也能工作;)
我经常使用这个结构来填充某个值n,已知是一个正的小数:
(offset + n + '').substr(1);
其中偏移量为10^^位。
例如,填充到5位数,其中n = 123:
(1e5 + 123 + '').substr(1); // => 00123
十六进制的版本稍微详细一些:
(0x100000 + 0x123).toString(16).substr(1); // => 00123
注1:我也喜欢@profitehlolz的解决方案,它是这个的字符串版本,使用slice()的漂亮的负索引特性。
这一种不太本土,但可能是最快的…
zeroPad = function (num, count) {
var pad = (num + '').length - count;
while(--pad > -1) {
num = '0' + num;
}
return num;
};
Mnah……我还没有看到这个问题的“终极”答案,如果你面临同样的挑战,我必须节省你一些时间,遗憾的是JavaScript中没有内置的函数。
但是PHP中有一个很棒的函数,它在填充字符串以及单个字符或任意字符串的数字方面做得很好。经过一段时间的思考,我没有合适的JavaScript工具(主要用于零数字,通常用于调整字符串以适应固定长度)和过多的编码工作,我决定编写自己的函数。
它做了同样的事情(“几乎一样”;详细信息请继续阅读),梦想的PHP函数可以做到,但在舒适的客户端JavaScript:
function str_pad(input, pad_length, pad_string, pad_type) {
var input = input.toString();
var output = "";
if((input.length > pad_length) &&
(pad_type == 'STR_PAD_RIGHT')) {
var output = input.slice(0, pad_length);
}
else
if((input.length > pad_length) &&
(pad_type == 'STR_PAD_LEFT')) {
var output = input.slice(input.length -
pad_length,input.length);
}
else
if((input.length < pad_length) &&
(pad_type == 'STR_PAD_RIGHT')) {
var caracteresNecesarios = pad_length-input.length;
var rellenoEnteros = Math.floor(caracteresNecesarios/pad_string.length);
var rellenoParte = caracteresNecesarios%pad_string.length;
var output = input;
for(var i=0; i<rellenoEnteros; i++) {
var output = output + pad_string;
};
var output = output + pad_string.slice(0, rellenoParte);
}
else
if((input.length < pad_length) &&
(pad_type=='STR_PAD_LEFT')) {
var caracteresNecesarios = pad_length-input.length;
var rellenoEnteros = Math.floor(caracteresNecesarios/pad_string.length);
var rellenoParte = caracteresNecesarios%pad_string.length;
var output = "";
for(var i=0; i<rellenoEnteros; i++) {
var output = output + pad_string;
};
var output = output + pad_string.slice(0, rellenoParte);
var output = output + input;
}
else
if(input.length == pad_length) {
var output = input;
};
return output;
};
我的函数唯一没有做的是STR_PAD_BOTH行为,我可以用一些时间和一个更舒适的键盘添加它。 你可以调用函数并测试它;如果你不介意内部代码使用一两个西班牙语单词,我打赌你会喜欢它的……我觉得没什么大不了的。我没有为“水印”我的代码添加注释,这样你就可以在你的工作中无缝地使用它,我也没有压缩代码以增强可读性。 使用它并像这样测试它,并传播代码:
alert("str_pad('murcielago', 20, '123', 'STR_PAD_RIGHT')=" + str_pad('murcielago', 20, '123', 'STR_PAD_RIGHT') + '.');