Введите число с начальными нулями в JavaScript.

Возможный дубликат:
Как создать значение Zerofilled с помощью JavaScript?

В JavaScript мне нужно иметь дополнение.

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

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

Можно ли сделать это?

Ответ 1

До сих пор не так много "гладких":

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, установленным для этого значения, так что массив, как представляется, содержит много элементов undefined. Хотя некоторые методы экземпляра массива пропускают элементы массива без значений, .join() не работает, или, по крайней мере, не полностью; он рассматривает их так, как будто их значение представляет собой пустую строку. Таким образом, вы получаете копию нулевого символа (или любого другого "z" ) между каждым из элементов массива; вот почему там + 1.

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

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

pad(10, 4, '-'); // --10

Ответ 2

function padToFour(number) {
  if (number<=9999) { number = ("000"+number).slice(-4); }
  return number;
}

Что-то вроде того?

Бонус непонятной, но приятной однострочной версии ES6:

let padToFour = number => number <= 9999 ? '000${number}'.slice(-4) : number;

ES6isms:

  • let - переменная области видимости блока (в отличие от области видимости var)
  • => - функция стрелки, которая помимо всего прочего заменяет function и добавляется к ее параметрам
  • Если функция со стрелкой принимает один параметр, вы можете опустить скобки (отсюда number =>)
  • Если тело функции со стрелкой имеет одну строку, которая начинается с return вы можете опустить фигурные скобки и ключевое слово return и просто использовать выражение
  • Чтобы свести тело функции к одной строке, я обманул и использовал троичное выражение

Ответ 3

Пытаться:

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


В ECMAScript 8 у нас есть новый метод padStart и padEnd который имеет синтаксис ниже.

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

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

const str = "5";
str.padStart(4, '0'); // '0005'

Ответ 4

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

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"

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

Ответ 5

Вы сказали, что у вас есть номер -

String.prototype.padZero= function(len, c){
    var s= '', c= c || '0', len= (len || 2)-this.length;
    while(s.length<len) s+= c;
    return s+this;
}
Number.prototype.padZero= function(len, c){
    return String(this).padZero(len,c);
}

Ответ 6

Вы можете сделать что-то вроде этого:

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 вещи:

  • Если число больше указанного размера, оно просто вернет номер.
  • Использование Math.floor(num) вместо ~~num будет поддерживать большие числа.

Ответ 7

Для удовольствия вместо использования цикла для создания дополнительных нулей:

function zeroPad(n,length){
  var s=n+"",needed=length-s.length;
  if (needed>0) s=(Math.pow(10,needed)+"").slice(1)+s;
  return s;
}

Ответ 8

На самом деле это не "slick", но быстрее выполнять операции с целыми числами, чем выполнять конкатенации строк для каждого дополнения 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-разрядная прокладка), поэтому она не является общей.

Ответ 9

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

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

Идея: просто замените "0000" номером, предоставленным... Проблема с этим, если input равно 0, мне нужно жестко запрограммировать его для возврата "0000". LOL.

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

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