Заполнение числа ведущими нулями в JavaScript

В JavaScript мне нужно, чтобы у меня было padding.

Например, если у меня есть число 9, то оно будет "0009". Если у меня есть число, скажем, 10, оно будет "0010". Обратите внимание, что оно всегда будет содержать четыре цифры.

Один из способов сделать это - вычесть число минус 4, чтобы получить количество 0, которое мне нужно поставить.

Есть ли более хитрый способ сделать это?

Комментарии к вопросу (15)

Не так уж много "хитростей" происходит до сих пор:

function pad(n, width, z) {
  z = z || '0';
  n = n + '';
  return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

Когда вы инициализируете массив числом, он создает массив с length, установленной на это значение, так что массив кажется содержащим столько неопределенных элементов. Хотя некоторые методы экземпляра массива пропускают элементы массива без значений, .join() этого не делает, по крайней мере, не полностью; он рассматривает их так, как будто их значением является пустая строка. Таким образом, вы получаете копию нулевого символа (или чего бы то ни было "z") между каждым из элементов массива; вот почему здесь присутствует + 1.

Пример использования:

pad(10, 4);      // 0010
pad(9, 4);       // 0009
pad(123, 4);     // 0123

pad(10, 4, '-'); // --10
Комментарии (14)

function padToFour(number) {
  if (number` - стрелочная функция, которая, помимо прочего, заменяет `function` и предваряется ее параметрами.
 - Если стрелочная функция принимает один параметр, можно опустить круглые скобки (отсюда `number =>`).
 - Если тело стрелочной функции состоит из одной строки, которая начинается с `return`, можно опустить скобки и ключевое слово `return` и просто использовать выражение
 - Чтобы свести тело функции к одной строке, я схитрил и использовал троичное выражение
Комментарии (10)

Попробуйте:

String.prototype.lpad = function(padString, length) {
    var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}

Теперь проверьте:

var str = "5";
alert(str.lpad("0", 4)); //result "0005"
var str = "10"; // note this is string type
alert(str.lpad("0", 4)); //result "0010"

[DEMO][1]


В ECMAScript 8 появился новый метод padStart и padEnd, который имеет следующий синтаксис.

'string'.padStart(targetLength [,padString]):

Итак, теперь мы можем использовать

const str = "5";
str.padStart(4, '0'); // '0005'
Комментарии (8)

Забавно, недавно мне пришлось сделать это.

function padDigits(number, digits) {
    return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
}

Использовать как:

padDigits(9, 4);  // "0009"
padDigits(10, 4); // "0010"
padDigits(15000, 4); // "15000"

Не красиво, но эффективно.

Комментарии (3)

Вы сказали, что вы были рядом-


String.prototype.padZero= function(len, c){
    var s= '', c= c || '0', len= (len || 2)-this.length;
    while(s.length
Комментарии (4)

Вы могли бы сделать нечто подобное:

function pad ( num, size ) {
  return ( Math.pow( 10, size ) + ~~num ).toString().substring( 1 );
}

Редактировать: это была основная идея для функции, но, чтобы добавить поддержку большего числа (а также "неверный ввод"), это, вероятно, будет лучше:

function pad ( num, size ) {
  if (num.toString().length >= size) return num;
  return ( Math.pow( 10, size ) + Math.floor(num) ).toString().substring( 1 );
}

Это делает 2 вещи:

  1. Если число превышает указанный размер, то он будет просто возвращать число.
  2. Используя Математика.пол(Нум)в месте~~Нум` будут поддерживаться более высокие цифры.
Комментарии (3)

Для начала, Вместо того, чтобы использовать цикл, чтобы создать лишние нули:

function zeroPad(n,length){
  var s=n+"",needed=length-s.length;
  if (needed>0) s=(Math.pow(10,needed)+"").slice(1)+s;
  return s;
}
Комментарии (3)

Поскольку вы сказали, Это's всегда будет иметь длину 4, я выиграл'т делать какие-либо проверки ошибок, чтобы сделать это пятно. ;)

function pad(input) {
    var BASE = "0000";
    return input ? BASE.substr(0, 4 - Math.ceil(input / 10)) + input : BASE;
}

Идея: просто замените '0000' с номером... проблема в том, что, если вход равен 0, мне нужно жестко его вернуть '0000'. ЛОЛ.

Этого должно быть достаточно гладким.

JSFiddler: http://jsfiddle.net/Up5Cr/

Комментарии (2)

Это на самом деле не 'Слик', но это's быстрее делать операции с целыми числами, чем сделать сцепление на каждой обивка 0.

function ZeroPadNumber ( nValue )
{
    if ( nValue < 10 )
    {
        return ( '000' + nValue.toString () );
    }
    else if ( nValue < 100 )
    {
        return ( '00' + nValue.toString () );
    }
    else if ( nValue < 1000 )
    {
        return ( '0' + nValue.toString () );
    }
    else
    {
        return ( nValue );
    }
}

Эта функция также жестко для вашей конкретной потребности (4-значный обивка), поэтому он's не универсальный.

Комментарии (3)