如何在javascript中将整数格式化为特定长度?

时间:2009-07-14 20:42:13

标签: javascript formatting

我在Javascript中有一个数字,我知道它不到10000而且也是非负数。我想将它显示为一个四位数字,带有前导零。有没有比以下更优雅的东西?

if(num<10) num="000"+num;
else if(num<100) num="00"+num;
else if(num<1000) num="0"+num;

我想要内置于Javascript中的内容,但我似乎找不到任何东西。

14 个答案:

答案 0 :(得分:76)

我想到的最简单的方法是:

("000" + num).slice(-4)

填充号码是一个字符串 向字符串添加数字时,会将其转换为字符串 字符串具有方法切片,可以返回固定长度的字符串片段 如果length为负,则返回的字符串将从字符串的末尾开始切片。

进行测试:

var num=12;
console.log(("000" + num).slice(-4)); // Will show "0012"

(因为这仅适用于最多4位的正整数)

答案 1 :(得分:40)

我认为JavaScript语言中没有任何“内置”功能。这是一个简单的功能:

function FormatNumberLength(num, length) {
    var r = "" + num;
    while (r.length < length) {
        r = "0" + r;
    }
    return r;
}


FormatNumberLength(10000, 5) outputs '10000'
FormatNumberLength(1000, 5)  outputs '01000'
FormatNumberLength(100, 5)   outputs '00100'
FormatNumberLength(10, 5)    outputs '00010'

答案 2 :(得分:15)

这可能会有所帮助:

String.prototype.padLeft = function (length, character) { 
     return new Array(length - this.length + 1).join(character || '0') + this; 
}

var num = '12';

alert(num.padLeft(4, '0'));

答案 3 :(得分:7)

由于ES2017填充到最小长度可以简单地用 String.prototype.padStartString.prototype.padEnd

let num = 3
let str = num.toString().padStart(3, "0")
console.log(str) // "003"

或者只是浮点数的整个部分应该是固定的长度:

let num = 3.141
let arr = num.toString().split(".")
arr[0] = arr[0].padStart(3, "0")
let str = arr.join(".")
console.log(str) // "003.141"

答案 4 :(得分:6)

一种有趣(但有趣)的方法,用零前缀数字:

function FormatInteger(num, length) {

    return (num / Math.pow(10, length)).toFixed(length).substr(2);
}

答案 5 :(得分:2)

我认为最紧凑而直观的方式是:

function toFixedLength(input, length, padding) {
    padding = String(padding || "0");
    return (padding.repeat(length) + input).slice(-length);
}

如果对编码员更直观,slice方法可以替换为substr

答案 6 :(得分:2)

最新使用ES6 repeat()方法:

any

答案 7 :(得分:1)

这样的事情怎么样:

function prefixZeros(number, maxDigits) 
{  
    var length = maxDigits - number.toString().length;
    if(length <= 0)
        return number;

    var leadingZeros = new Array(length + 1);
    return leadingZeros.join('0') + number.toString();
}
//Call it like prefixZeros(100, 5); //Alerts 00100

答案 8 :(得分:1)

我来寻找答案,但我认为这是一种更好的功能方法(ES6):

const formatNumberToString = (num, minChars) => {
  return num.toString().length < minChars
   ? formatNumberToString(`0${num}`, minChars)
   : num.toString()
}
// formatNumberToString(12, 4) // "0012"
// formatNumberToString(12, 5) // "00012"
// formatNumberToString(1, 4) // "0001"
// formatNumberToString(1, 2) // "01"
// formatNumberToString(12, 2) // "12"
// formatNumberToString(12, 1) // "12"

另外,这可以在一行中实现

答案 9 :(得分:0)

你可能会对这些方法发疯:

function PadDigits(input, totalDigits) 
{ 
    var result = input;
    if (totalDigits > input.length) 
    { 
        for (i=0; i < (totalDigits - input.length); i++) 
        { 
            result = '0' + result; 
        } 
    } 
    return result;
} 

但它不会让生活更轻松。 C#在String类中有一个类似PadLeft和PadRight的方法,遗憾的是Javascript没有内置的这个功能

答案 10 :(得分:0)

“while”循环应该足够简单。

function formatLength(a) {
    var num = document.getElementById(a)
    while (num.value.length < 4) {
        num.value = '0' + num.value
    }
}

这将循环直到num值的长度达到4位数(假设你已经传递了number元素的id作为参数)

答案 11 :(得分:0)

我遇到了同样的问题,我发现了一种解决它的紧凑方法。如果我必须在我的代码中多次使用它,或者如果我使用的是超过四位的数字,我会使用其他建议的解决方案之一,但这样我就可以把它全部放在一个表达式中:

((x<10)?"000": (x<100)?"00": (x<1000)?"0": "") + x

它实际上与您的代码相同,但是使用三元运算符而不是“if-else”语句(并且在条件代码之外移动“+ x”,它将始终是表达式的一部分)。 / p>

答案 12 :(得分:0)

另一个:

function format_number_length(num, length) {
    var r = num.toString();
    if (r.length<length) r = Array(length - r.length + 1).join('0') + r;
    return r;
}

答案 13 :(得分:0)

我知道这个问题有点老了,但是对于任何想要在Java或Python上查找类似于String格式的东西的人,我都有以下帮助方法:

String.format = (...args) => {
    if( args.length == 0 ){
        throw new Error("String format error: You must provide at least one argument");
    }
    const delimiter = "@LIMIT*";
    const format = String(args.shift(1,0)).replace(/(%[0-9]{0,}[sd])/g, delimiter+"$1"+delimiter).split(delimiter); // First element is the format
    if( [...format].filter(el=>el.indexOf("%")>-1).length != args.length ){
        throw new Error("String format error: Arguments must match pattern");
    }
    if( format.length == 1 && args.length == 0 ){
        return String(format);
    }
    let formattedString = "";
    // patterns
    const decimalPattern = /%[0-9]{0,}d/;
    const stringPattern  = /%s/;
    if( format.length == 0 ){
        throw new Error("String format error: Invalid format");
    }
    let value        = null;
    let indexOfParam = 0;
    let currPattern  = null;
    while( args.length > 0 ) {
        currPattern = format[indexOfParam];
        indexOfParam++;
        if( currPattern.indexOf("%")<0 ){
            formattedString+=currPattern;
            continue;
        }
        value = args.shift(0,1);
        if( decimalPattern.test(currPattern) ){
            let numberLength = parseInt(currPattern.replace(/[^0-9]/g,''));
            if( isNaN(numberLength) ){
                numberLength = 0;
            }
            formattedString+=numberToLength(value, numberLength);
        } else if( stringPattern.test(currPattern) ) {
            if( typeof value === 'object' && value.toSource ){
                formattedString+=String(value.toSource());
            } else {
                formattedString+=String(value);
            }
        } else {
            throw new Error("String format error: Unrecognized pattern:"+currPattern);
        }
    }
    return formattedString;
}

const numberToLength = (number, length) => {
    length = parseInt(length);
    number = String(number);
    if( isNaN(length) || isNaN(parseInt(number)) ){
        throw new Error("Invalid number passed");
    }
    while( number.length < length ) {
        number = "0" + number;
    }
    return number;
}