Дополните число ведущими нулями в 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 вещи:
- Если число больше указанного размера, оно просто вернет число.
- С помощью
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/