Введите число с начальными нулями в 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/