How to output integers with leading zeros in JavaScript
Possible Duplicate:
How can I create a Zerofilled value using JavaScript?
我可以用math.round将小数位数四舍五入到x,但是有没有办法将小数的左边四舍五入?例如,如果我指定2个位置,5将变为05
- 不是舍入,这是字符串格式。
- 这不是四舍五入。正在格式化..
- 我觉得这个更简单:("00" + h).slice (-3);。
- @paulobueno ("00" + 1234).slice (-3);给出234,即丢弃最重要的数字。
- @Danielarwicker当然可以,但是你应该调整到你期望的数字的数量。("000" + 1234).slice(-4)、("0000" + 12345).slice(-5)等……
- 如果您还想限制数字的长度,可以使用:return (num/Math.pow(10,size)).toFixed(size).split('.')[1];
- 要使用@loafer解决方案而不预先知道您的号码的最大长度,您应该首先使用以下内容:size = ('' + num).length;(对于正整数值)
- 我也喜欢@loafer的方法,但如果数字比预期的大小多,它就不起作用。这似乎更有效:(num/Math.pow(10, size) + '').replace(/0{0,1}\./m, '')。请记住,这两个解都只适用于整数。
- 现在javascript支持padstart:(5).toString().padStart(3,"0")。
- 使用三元逻辑的一个简单的一行程序:num < 10 ? num = '0'+num : null。
NOTE: Potentially outdated. ECMAScript 2017 includes String.prototype.padStart
你要零填充?不是真的四舍五入。你必须把它转换成一个字符串,因为数字的前导零没有意义。像这样的…
1 2 3 4 5
| function pad(num, size) {
var s = num+"";
while (s.length < size) s ="0" + s;
return s;
} |
或者如果你知道你永远不会用超过x个零,这可能会更好。这假设您永远不需要超过10位数字。
1 2 3 4
| function pad(num, size) {
var s ="000000000" + num;
return s.substr(s.length-size);
} |
如果你关心负数,你就必须去掉"-"并把它读出来。
- 第二功能;较短:function pad(num, size){ return ('000000000' + num).substr(-size); }。
- ^在许多版本的IE中,负值不起作用。
- 啊,显然slice()在ie-though:)stackoverflow.com/questions/2243824/&hellip中使用负值。
- 也许是一个如何调用函数和结果的示例?
- 计算出:value=pad(value,18);=>总是返回18个字符,所以如果加上10,零的大小应该是10。
- 如果你用空格而不是0,那就更好了。
- 第二个功能快5倍。js.do/code/填充
- es6:const pad=(n,s)=>('000000000'+n).substr(-s);
- 说明中建议的padStart效果良好!
- 另一个选项是按区域设置将数字转换为字符串,并指定num.toLocaleString(undefined, { minimumIntegerDigits: size })developer.mozilla.org/en-us/docs/web/javascript/reference/&hellip的最小整数位数;
- 嗯,只是好奇,第一个版本(使用while (s.length < size) s ="0" + s;)似乎有二次运行时间(即O(n^2))——是关于JS中的字符串连接的问题,我不知道,还是没有人真正关心JS中的渐进复杂性?:)
您可以扩展Number对象:
1 2 3 4 5
| Number.prototype.pad = function(size) {
var s = String(this);
while (s.length < (size || 2)) {s ="0" + s;}
return s;
} |
实例:
1 2 3
| (9).pad(); //returns"09"
(7).pad(3); //returns"007" |
- 我想这正是我需要的。参数"size"指的是最后的字符数,而不是要加的零的总数,对吗?
- 是的,它会检查总长度并进行比较。
- 是的,这取决于你在哪里使用它。这并非本质上的坏事,但如果在有大量第三方参与的空间中使用,则可能存在覆盖功能的风险。
- (9).pad()和(7).pad(3)带着帕伦斯!
- @亚当,你看到文章的日期了吗?所以这在IE6中表现不好,:尖叫:!感谢温和。
- 这个问题与全球的情况不可比,也与IE6没有任何关系。问题是永恒的。多年前发现的事实并不能使它消失。问题是语言本身在进化。谁能说你的.pad()会像本机版本一样工作,它会不会出现?我找不到我原来的评论。希望这只是堆栈溢出中的一个bug。如果它被删除,那将是对周围事物状态的糟糕反映。
- 这个答案是很久以前写的,但我想我认为在扩展的原型中有一种令人愉快的优雅。我了解风险,我从来没有在客户工作中这样做,但我喜欢这样做。这种风险可以通过名称间距来减轻,称之为"mypad"或其他什么。
- 但是,如果你不完全理解风险,就不要这样做。
- 扩展函数的性能比简单函数要差。所以不要扩展原型。
- 嘿@inferus vv,有基准点可以参考吗?有趣的一点
- @米尔德夫兹,我在一个答案中看到了一些测试。你可以在jspef测试它
- @我相信我可以测试它,但我的想法是,如果你有一个链接,对那些考虑这种方法的人来说,在答案中添加内容是很有用的。
另一种方法:
1 2 3 4 5 6 7 8 9
| function zeroPad(num, places) {
var zero = places - num.toString().length + 1;
return Array(+(zero > 0 && zero)).join("0") + num;
}
zeroPad(5, 2); //"05"
zeroPad(5, 4); //"0005"
zeroPad(5, 6); //"000005"
zeroPad(1234, 2); //"1234" :) |
- +1-我打算建议使用数组连接方法,直到InfinitesLop发布了他的答案,我改变了主意:—)
- 您没有考虑负数组大小;)例如zeroPad(1234, 2)->RangeError: Invalid array length
- 根据这个基准,这个方法比公认的解决方案慢5倍:gist.github.com/4382935
- 我喜欢这个代码,但它在Chrome中似乎慢了一些。有兴趣查看其他浏览器的结果:jspef.com/zero-padding-number-methods
来自https://gist.github.com/1180489
1
| function pad(a,b){return(1e15+a+"").slice(-b)} |
附注:
1 2 3 4 5 6 7 8 9
| function pad(
a, // the number to convert
b // number of resulting characters
){
return (
1e15 + a + // combine with large number
"" // convert to string
).slice(-b) // cut leading"1"
} |
- 这很好,但它有一个致命的缺陷。例如,pad (1234, 3) ==="234"!这显然是不可接受的。
- 如果你想让填充物超过15,它也会坏掉。优雅,但相当僵硬。
- @Dave1010我得到了一个坏结果:pad(1234)生成"1000000000001234"。参数pad(1234,20)生成"1000000000001234",谢谢@brck adams
- @詹姆斯霍马斯穆恩,1979年,看这个答案。它不仅工作正常(虽然大多数其他答案都失败了许多测试案例),而且显著优于其他方法——特别是如果您使用注释中链接的对数变化。
- @Brockadams我的测试用例在我之前的评论中。它不能正常工作。在Ubuntu的火狐35上测试过。
1
| function zfill(num, len) {return (Array(len).join("0") + num).slice(-len);} |
- 当您发布代码时,选择它并单击{}按钮,使其格式化。
- zfill(1234,3)=="234"
- 函数zfill(n,l)return(l>n.toString().length)?((array(l).join('0')+n).slice(-l)):n&zwnj;&8203;;
只是为了好玩(我有一些时间来消磨),一个更复杂的实现,它缓存零字符串:
1 2 3 4 5 6 7 8 9
| pad.zeros = new Array(5).join('0');
function pad(num, len) {
var str = String(num),
diff = len - str.length;
if(diff <= 0) return str;
if(diff > pad.zeros.length)
pad.zeros = new Array(diff + 1).join('0');
return pad.zeros.substr(0, diff) + str;
} |
如果填充计数很大并且函数的调用频率足够高,那么它实际上比其他方法更好…