Возможный дубликат:
Как создать нулевое значение с помощью JavaScript?
В JavaScript мне нужно, чтобы у меня было padding.
Например, если у меня есть число 9, то оно будет "0009". Если у меня есть число, скажем, 10, оно будет "0010". Обратите внимание, что оно всегда будет содержать четыре цифры.
Один из способов сделать это - вычесть число минус 4, чтобы получить количество 0, которое мне нужно поставить.
Есть ли более хитрый способ сделать это?
Не так уж много "хитростей" происходит до сих пор:
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
function padToFour(number) {
if (number<=9999) { number = ("000"+number).slice(-4); }
return number;
}
Что-то вроде этого?
Бонусная непонятная, но более тонкая однострочная версия ES6:
let padToFour = number => number <= 9999 ? `000${number}`.slice(-4) : number;
ES6измы:
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
][1]
В ECMAScript 8 появился новый метод 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 вещи:
в месте
~~Нум` будут поддерживаться более высокие цифры.Поскольку вы сказали, Это's всегда будет иметь длину 4, я выиграл'т делать какие-либо проверки ошибок, чтобы сделать это пятно. ;)
function pad(input) {
var BASE = "0000";
return input ? BASE.substr(0, 4 - Math.ceil(input / 10)) + input : BASE;
}
Идея: просто замените '0000' с номером... проблема в том, что, если вход равен 0, мне нужно жестко его вернуть '0000'. ЛОЛ.
Этого должно быть достаточно гладким.
JSFiddler:
Это на самом деле не 'Слик', но это'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 не универсальный.