使用jQuery在数字前添加额外的零?


81

我上传的文件格式如下

先生1

先生2

先生100

MR 200

MR 300

等等。

我需要做的是在MR 10之前的任何内容前添加两个额外的00,在MR10-99之前的内容中添加一个额外的0。

因此文件已格式化

先生001

先生010

先生076

等等。

任何帮助将是巨大的!


3
jQuery不会在这里为您提供帮助(至少在格式方面没有帮助)...但是如何访问文件?您如何获取内容?上下文不清楚。请至少提供一些代码,以便我们更好地理解问题。
Felix Kling

@FelixKling文件不相关。他在问格式化问题。
felwithe

Answers:


214

假设这些值存储在某些字符串中,请尝试以下操作:

function pad (str, max) {
  str = str.toString();
  return str.length < max ? pad("0" + str, max) : str;
}

pad("3", 3);    // => "003"
pad("123", 3);  // => "123"
pad("1234", 3); // => "1234"

var test = "MR 2";
var parts = test.split(" ");
parts[1] = pad(parts[1], 3);
parts.join(" "); // => "MR 002"

3
我知道这很旧,但是此功能对我有帮助,我认为我会补充一下。这将执行类型转换为整数或浮点数的变量,这意味着你可以做pad(85, 5),以及pad("85", 5)return (str).toString().length < max ? pad("0" + (str).toString(), max) : (str).toString();
雷米·布雷顿

7
@RémiBreton您的函数使用了太多次.toString()。我认为这样会更好function pad (str, max) { str=str.toString(); function main(str,max){ return str.length < max ? main("0" + str, max) : str; } return main(str,max); }
Oriol

2
String.prototype.padLeft =函数padLeft(length,LeadingChar){如果(leadingChar ===未定义)Leading Char =“ 0”; 返回this.length <length?(leadingChar + this).padLeft(length,leadingChar):this; };
蒂姆·瓦伦丁

34

我有一个可能的解决方案,我想这是无关紧要的,我在这里张贴了一下:

https://www.facebook.com/antimatterstudios/posts/10150752380719364

基本上,您想要的最小长度为2或3,您可以调整在这段代码中放入多少个0

var d = new Date();
var h = ("0"+d.getHours()).slice(-2);
var m = ("0"+d.getMinutes()).slice(-2);
var s = ("0"+d.getSeconds()).slice(-2);

我知道我总是会得到一个最小的整数(因为小时1,小时2),等等,但是如果您不能确定除了空字符串之外什么都可以,则可以执行“ 000” + d.getHours( ),以确保您获得最低的收益。

那你要3个数字吗?在我的代码中只使用-3而不是-2,我之所以这样写是因为我想以一种超级简单的方式构造一个24小时制时钟。


21

注意: 如果您使用的是最新的ECMAScript,请参阅更新2


这是我喜欢的解决方案,因为它的简单性来自一个类似问题的答案

var n = 123

String('00000' + n).slice(-5); // returns 00123
('00000' + n).slice(-5);       // returns 00123

更新

正如@RWC所建议的,您当然可以很好地将其包装在这样的通用函数中:

function leftPad(value, length) { 
    return ('0'.repeat(length) + value).slice(-length); 
}

leftPad(123, 5); // returns 00123

对于那些谁不喜欢切片:

function leftPad(value, length) {
    value = String(value);
    length = length - value.length;
    return ('0'.repeat(length) + value)
}

但是,如果性能很重要,建议您在选择建议的解决方案之一之前通读链接的答案。

更新2

在ES6中,String类现在带有一个内置padStart方法,该方法将首字符添加到字符串中。在此处检查MDN以获取参考String.prototype.padStart()。还有一个padEnd一种结束字符方法。

因此,使用ES6,它变得非常简单:

var n = 123;
n.padStart(5, '0'); // returns 00123

3
改进版本:函数leftPad(value,maxLength){return String('0'.repeat(maxLength)+ value).slice(-maxLength); }
RWC

7
function addLeadingZeros (n, length)
{
    var str = (n > 0 ? n : -n) + "";
    var zeros = "";
    for (var i = length - str.length; i > 0; i--)
        zeros += "0";
    zeros += str;
    return n >= 0 ? zeros : "-" + zeros;
}

//addLeadingZeros (1, 3) =   "001"
//addLeadingZeros (12, 3) =  "012"
//addLeadingZeros (123, 3) = "123"

换句话说:将其转换为字符串,然后用零填充
pavium 2011年

4

我通常在代码中使用此函数,以在数字或字符串前加零。

输入是字符串或数字(str),以及所需的输出长度(len)。

var PrependZeros = function (str, len) {
    if(typeof str === 'number' || Number(str)){
    str = str.toString();
    return (len - str.length > 0) ? new Array(len + 1 - str.length).join('0') + str: str;
}
else{
    for(var i = 0,spl = str.split(' '); i < spl.length; spl[i] = (Number(spl[i])&& spl[i].length < len)?PrependZeros(spl[i],len):spl[i],str = (i == spl.length -1)?spl.join(' '):str,i++);
    return str;
}

};

例子:

PrependZeros('MR 3',3);    // MR 003
PrependZeros('MR 23',3);   // MR 023
PrependZeros('MR 123',3);  // MR 123
PrependZeros('foo bar 23',3);  // foo bar 023

2

如果在空间上分割,则可以使用以下简单函数添加前导零:

function addZeros(n) {
  return (n < 10)? '00' + n : (n < 100)? '0' + n : '' + n;
}

因此,您可以测试字符串的长度,如果长度小于6,请在空格上分割,在数字上添加零,然后将其重新连接在一起。

或作为正则表达式:

function addZeros(s) {
  return s.replace(/ (\d$)/,' 00$1').replace(/ (\d\d)$/,' 0$1');
}

我确信有人可以一次更换,而不是两次更换。

编辑-示例

alert(addZeros('MR 3'));    // MR 003
alert(addZeros('MR 23'));   // MR 023
alert(addZeros('MR 123'));  // MR 123
alert(addZeros('foo bar 23'));  // foo bar 023

它将在字符串末尾的数字前放置一个或两个零。不在乎空格是多少。


如果说某人的文档具有MR 003,会发生什么情况,我们可以忽略加0等
吗?

2

只是为了开怀大笑,这很讨厌。...:(
注意:香港专业教育学院没有使用过,我也不建议使用。!)

function pad(str, new_length) {
    ('00000000000000000000000000000000000000000000000000' + str).
    substr((50 + str.toString().length) - new_length, new_length)
}

1

前几天我自己需要类似的东西,Pud而不是始终为0,我希望能够告诉它我想要在前端填充什么。这是我想出的代码:

function lpad(n, e, d) {
  var o = ''; if(typeof(d) === 'undefined'){ d='0'; } if(typeof(e) === 'undefined'){ e=2; }
  if(n.length < e){ for(var r=0; r < e - n.length; r++){ o += d; } o += n; } else { o=n; }
  return o; }

其中n是您要填充的内容,e是您要填充的幂(应该是多少个字符),而d是您要对其填充的内容。似乎可以很好地满足我的需求,但是在某些情况下,如果“ d”超过一个字符长,它将失败。



1

str可以是数字或字符串。

formatting("hi",3);
function formatting(str,len)
{
   return ("000000"+str).slice(-len);
}

如果需要大数字,则添加更多


0

简单来说,我们可以这样写:

for(var i=1;i<=31;i++)
    i=(i<10) ? '0'+i : i;

//因为大多数时候我们都需要此日期,月份或金额。


0

知道这是一篇老文章,但这是另一种有效的简短方法: 零

编辑:dur。如果num不是字符串,则添加:

len -= String(num).length;

否则,一切都很好

function addLeadingZeros(sNum, len) {
    len -= sNum.length;
    while (len--) sNum = '0' + sNum;
    return sNum;
}

0

通过将数字加100,然后运行一个从索引1到右侧最后位置的子字符串函数。

var dt = new Date();
var month = (100 + dt.getMonth()+1).toString().substr(1, 2);
var day = (100 + dt.getDate()).toString().substr(1, 2);

console.log(month,day);

您将从2020-11-3的日期获得此结果

11,03

我希望答案是有用的


-1

尝试执行以下操作,这将通过在前缀前面加上零将转换后的一位数字和两位数字转换为3位数字。

var base_number = 2;
var zero_prefixed_string = ("000" + base_number).slice(-3);

尽管此代码可以为问题提供解决方案,但最好添加有关其原因/工作方式的上下文。这可以帮助将来的用户学习并将该知识应用于他们自己的代码。在解释代码时,您还可能以投票的形式从用户那里获得积极的反馈。
borchvm

注意并作相应修改。
vivek shirodkar,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.