Дополните число ведущими нулями в JavaScript

Возможный дубликат:
Как я могу создать значение с нулевым заполнением, используя JavaScript?

В JavaScript мне нужно иметь отступы.

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

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

Был ли более приятный способ сделать это?

9 ответов

Пока не так много "скользких" событий:

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

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

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

pad(10, 4, '-'); // --10
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 ключевое слово и просто использовать выражение
  • Чтобы свести тело функции к одной строке, я обманул и использовал троичное выражение

Пытаться:

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


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

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

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

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

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

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"

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

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

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);
}

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

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. С помощью Math.floor(num) на месте ~~num будет поддерживать большие числа.

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

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

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

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

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

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

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

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

Другие вопросы по тегам