Como formatar números, acrescentando 0 a números de um dígito?

Respostas:

594

O melhor método que encontrei é algo como o seguinte:

(Observe que esta versão simples funciona apenas para números inteiros positivos)

var myNumber = 7;
var formattedNumber = ("0" + myNumber).slice(-2);
console.log(formattedNumber);

Para decimais, você pode usar esse código (embora seja um pouco desleixado).

var myNumber = 7.5;
var dec = myNumber - Math.floor(myNumber);
myNumber = myNumber - dec;
var formattedNumber = ("0" + myNumber).slice(-2) + dec.toString().substr(1);
console.log(formattedNumber);

Por fim, se você tiver que lidar com a possibilidade de números negativos, é melhor armazenar o sinal, aplicar a formatação ao valor absoluto do número e reaplicar o sinal após o fato. Observe que esse método não restringe o número a 2 dígitos no total. Em vez disso, restringe apenas o número à esquerda do decimal (a parte inteira). (A linha que determina o sinal foi encontrada aqui ).

var myNumber = -7.2345;
var sign = myNumber?myNumber<0?-1:1:0;
myNumber = myNumber * sign + ''; // poor man's absolute value
var dec = myNumber.match(/\.\d+$/);
var int = myNumber.match(/^[^\.]+/);

var formattedNumber = (sign < 0 ? '-' : '') + ("0" + int).slice(-2) + (dec !== null ? dec : '');
console.log(formattedNumber);

Joseph Marikle
fonte
4
@KeithPower que demonstração não for ilustrar isso
Joseph Marikle
1
@KeithPower Aqui está uma demonstração que ilustra o método acima: jsfiddle.net/bkTX3 . Clique na caixa, altere o valor e clique fora da caixa para vê-lo em ação.
31811 Joseph Marikle
1
@Joseph .75 é transformado em 75. #
288 Galled
@ Galled normalmente esse tipo de coisa não é necessária com essa forma de formatação na minha experiência, mas criei uma edição que cobriria esse cenário.
Joseph Marikle 26/11/11
Também dê uma olhada no .toPrecision()método w3schools.com/jsref/jsref_toprecision.asp
Oleg
133

Se o número for maior que 9, converta o número em uma sequência (consistência). Caso contrário, adicione um zero.

function n(n){
    return n > 9 ? "" + n: "0" + n;
}

n( 9); //Returns "09"
n(10); //Returns "10"
n(999);//Returns "999"
Rob W
fonte
4
Mas e quanto tempo negativo? 0-1: 20: 00
mjwrazor 04/04
131

Use o método toLocaleString () em qualquer número. Portanto, para o número 6, como visto abaixo, você pode obter os resultados desejados.

(6).toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false})

Irá gerar a string '06'.

nyteshade
fonte
17
Definitivamente, é melhor do que cortar as cordas manualmente. De maneira mais sucinta, e se sua página puder ser usada fora dos EUA, convém ajustá-lo para:(6).toLocaleString(undefined, {minimumIntegerDigits: 2})
Mark Slater
2
Usando este com o IE 9 cria 6,00 em vez de 06.
de Drew
1
Obras, mas você precisa IE> = 11.
Saftpresse99
ou com intl.js polyfil
maxisam 19/17/17
2
Estou pronto para ignorar o IE, mas não é bem suportado em navegadores móveis. src: developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
chetan92
50

Aqui está uma função simples de preenchimento de números que eu costumo usar. Permite qualquer quantidade de preenchimento.

function leftPad(number, targetLength) {
    var output = number + '';
    while (output.length < targetLength) {
        output = '0' + output;
    }
    return output;
}

Exemplos:

leftPad(1, 2) // 01
leftPad(10, 2) // 10
leftPad(100, 2) // 100
leftPad(1, 3) // 001
leftPad(1, 8) // 00000001
timrwood
fonte
também tem problemas com o tempo negativo. Existe uma correção para isso?
Mjwrazor
39

Em todos os navegadores modernos, você pode usar

numberStr.padStart(2, "0");

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

function zeroPad(numberStr) {
  return numberStr.padStart(2, "0");
}

var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

numbers.forEach(
  function(num) {
    var numString = num.toString();
    
    var paddedNum = zeroPad(numString);

    console.log(paddedNum);
  }
);

Lifehack
fonte
1
Esteja ciente de que isso não é suportado no IE em todos os developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tim
Também não funciona em algumas versões mais antigas do nó (possivelmente nada mais velho do que nó 8)
JSilv
20

A resposta de @ Lifehack foi muito útil para mim; onde eu acho que podemos fazer isso em uma linha para números positivos

 String(input).padStart(2, '0');
Jee Mok
fonte
12
("0" + (date.getMonth() + 1)).slice(-2);
("0" + (date.getDay())).slice(-2);
Rígido
fonte
1
Eu acho que você quis dizer o seguinte para obter o dia do mês:("0" + (date.getDate())).slice(-2);
Jeff Moeller
11

Você pode fazer:

function pad2(number) {
   return (number < 10 ? '0' : '') + number
}

Exemplo:

document.write(pad2(0) + '<br />');
document.write(pad2(1) + '<br />');
document.write(pad2(2) + '<br />');
document.write(pad2(10) + '<br />');
document.write(pad2(15) + '<br />');

Resultado:

00
01
02
10
15
fanaur
fonte
8

Parece que você pode ter uma string, em vez de um número. usa isto:

var num = document.getElementById('input').value,
    replacement = num.replace(/^(\d)$/, '0$1');
document.getElementById('input').value = replacement;

Aqui está um exemplo: http://jsfiddle.net/xtgFp/

Joe
fonte
7

Um forro rápido e sujo ....

function zpad(n, len) {
  return 0..toFixed(len).slice(2,-n.toString().length)+n.toString();
}
pwuk
fonte
1
Excelente trabalho. É melhor usar isso como método de extensão como este:Number.prototype.leftPad = String.prototype.leftPad = function (pad) { return 0..toFixed(pad).slice(2, -this.toString().length) + this.toString(); };
ConducedClever 5/19
6

Isso é simples e funciona muito bem:

function twoDigit(number) {
  var twodigit = number >= 10 ? number : "0"+number.toString();
  return twodigit;
}
nickolusroy
fonte
1
pode ser escrito como: número de retorno> = 10? número: "0" + número.toString ();
Apfz
6

Aqui está uma solução muito simples que funcionou bem para mim.

Primeiro declare uma variável para armazenar seu número.

var number;

Agora converta o número em uma string e mantenha-o em outra variável;

var numberStr = number.toString();

Agora você pode testar o comprimento dessa sequência, se for menor que o desejado, você pode acrescentar um 'zero' no início.

if(numberStr.length < 2){
      number = '0' + number;
}

Agora use o número conforme desejado

console.log(number);
Edgar256
fonte
6

Aqui está a solução mais fácil que encontrei: -

let num = 9; // any number between 0 & 99
let result = ( '0' + num ).substr( -2 );
Bassam
fonte
5

Versão aprimorada da resposta anterior

function atLeast2Digit(n){
    n = parseInt(n); //ex. if already passed '05' it will be converted to number 5
    var ret = n > 9 ? "" + n: "0" + n;
    return ret;
}

alert(atLeast2Digit(5));

hack4mer
fonte
5

Eu sei que este é um post antigo, mas eu queria fornecer uma opção de solução OO mais flexível e.

Extrapolei um pouco a resposta aceita e estendi o Numberobjeto do javascript para permitir o preenchimento zero ajustável:

Number.prototype.zeroPad = function(digits) {
  var loop = digits;
  var zeros = "";
  while (loop) {
    zeros += "0";
    loop--;
  }
  return (this.toString().length > digits) ?
    this.toString() : (zeros + this).slice(-digits);
}
var v = 5;
console.log(v.zeroPad(2)); // returns "05"
console.log(v.zeroPad(4)); // returns "0005"

Editar: adicione código para evitar o corte de números maiores que os dígitos solicitados.

NOTA: Isso é obsoleto em todos, exceto no IE. Use em padStart()vez disso.

Noah Duncan
fonte
4

Não há um formatador de número interno para JavaScript, mas existem algumas bibliotecas que fazem isso:

  1. underscore.string fornece uma função sprintf (junto com muitos outros formatadores úteis)
  2. javascript-sprintf , que underscore.string empresta.
coltraneofmars
fonte
3

ou

function zpad(n,l){
   return rep(l-n.toString().length, '0') + n.toString();
}

com

function rep(len, chr) { 
   return new Array(len+1).join(chr);
}
pwuk
fonte
3

Se você deseja limitar seus dígitos ao mesmo tempo:

function pad2(number) {
  number = (number < 10 ? '0' : '') + number;
  number = number.substring(0,2);
  return number;
}

Isso também cortaria qualquer valor que exceda dois dígitos. Eu estendi isso sobre a solução de Fanaur.

leopold
fonte
2
<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
        <script type="text/javascript">
            $(document).ready(function(){
                $('#test').keypress(allowOnlyTwoPositiveDigts);
            });

            function allowOnlyTwoPositiveDigts(e){

                var test = /^[\-]?[0-9]{1,2}?$/
                return test.test(this.value+String.fromCharCode(e.which))
            }

        </script>
    </head>
    <body>
        <input id="test" type="text" />
    </body>
</html>
Victor Jatobá
fonte
2

Aqui está uma solução recursiva simples que funciona para qualquer número de dígitos.

function numToNDigitStr(num, n)
{
    if(num >=  Math.pow(10, n - 1)) { return num; }
    return "0" + numToNDigitStr(num, n-1);
}
user1052527
fonte
2

Se você não possui lodash em seu projeto, será um exagero adicionar a biblioteca inteira apenas para usar uma função. Esta é a solução mais sofisticada do seu problema que eu já vi.

_.padStart(num, 2, '0')
kucherenkovova
fonte
1

Aqui está a minha versão. Pode ser facilmente adaptado a outros cenários.

function setNumericFormat(value) {
    var length = value.toString().length;
    if (length < 4) {
        var prefix = "";
        for (var i = 1; i <= 4 - length; i++) {
            prefix += "0";
        }
        return prefix + value.toString();
    }
    return  value.toString();
}
Veverke
fonte
1
    function colorOf(r,g,b){
  var f = function (x) {
    return (x<16 ? '0' : '') + x.toString(16) 
  };

  return "#" +  f(r) + f(g) + f(b);
}
Alexey Tseitlin
fonte
Você deve adicionar algum contexto, não apenas código às suas respostas.
22416 Mike
1

Para quem quer ter diferenças de horário e obter resultados que podem levar números negativos, aqui é bom. bloco (3) = "03", bloco (-2) = "-02", bloco (-234) = "-234"

pad = function(n){
  if(n >= 0){
    return n > 9 ? "" + n : "0" + n;
  }else{
    return n < -9 ? "" + n : "-0" + Math.abs(n);
  }
}
mjwrazor
fonte
1

Com esta função, você pode imprimir com os n dígitos que desejar

function frmtDigit(num, n) {
    isMinus = num < 0;
    if (isMinus)
        num *= -1;
    digit = '';
    if (typeof n == 'undefined')
        n = 2;//two digits
    for (i = 1; i < n; i++) {
        if (num < (1 + Array(i + 1).join("0")))
            digit += '0';
    }
    digit = (isMinus ? '-' : '') + digit + num;
    return digit;
};
jalmatari
fonte
1

meu exemplo seria :

<div id="showTime"></div>

    function x() {
    var showTime = document.getElementById("showTime");
    var myTime = new Date();
    var hour = myTime.getHours();
    var minu = myTime.getMinutes();
    var secs = myTime.getSeconds();
    if (hour < 10) {
        hour = "0" + hour
    };
    if (minu < 10) {
        minu = "0" + minu
    };
    if (secs < 10) {
        secs = "0" + secs
    };

    showTime.innerHTML = hour + ":" + minu + ":" + secs;
}

setInterval("x()", 1000)
DHJ
fonte
1

`${number}`.replace(/^(\d)$/, '0$1');

Regex é o melhor.

Filho Tr.
fonte
Isso parece ser quase exatamente o mesmo que a resposta de Joe acima. Considere adicionar informações adicionais para melhorar sua resposta ou excluí-las completamente.
Ethan
1

Como o tipo de dados AS em Javascript é determinado dinamicamente, ele trata 04 como 4 .

var x=4;
  x = x<10?"0"+x:x
 console.log(x); // 04
Siddhartha
fonte
1

Criei uma função de formato bastante simples que chamo sempre que preciso de uma data simples formatada. Ele lida com a formatação de um dígito para dois dígitos quando eles são menores que 10. Ele inicia uma data formatada comoSat Sep 29 2018 - 00:05:44

Essa função é usada como parte de uma variável utils, por isso é chamada como:

let timestamp = utils._dateFormatter('your date string');

var utils = {
  _dateFormatter: function(dateString) {
    let d = new Date(dateString);
    let hours = d.getHours();
    let minutes = d.getMinutes();
    let seconds = d.getSeconds();
    d = d.toDateString();
    if (hours < 10) {
      hours = '0' + hours;
    }
    if (minutes < 10) {
      minutes = '0' + minutes;
    }
    if (seconds < 10) {
      seconds = '0' + seconds;
    }
    let formattedDate = d + ' - ' + hours + ':' + minutes + ':' + seconds;
    return formattedDate;
  }
}
Arq
fonte
1

Atualizado para as funções de seta do ES6 (suportado em quase todos os navegadores modernos, consulte CanIUse )

const formatNumber = n => ("0" + n).slice(-2);
aabbccsmith
fonte