0'ı tek basamaklı sayılara başlayarak sayıları nasıl biçimlendirebilirim?


297

Bir sayıyı iki basamaklı olacak şekilde biçimlendirmek istiyorum. Sorun 0- 9geçtiğinde neden olur , bu yüzden 00- biçimlendirilmesi gerekiyor 09.

JavaScript'te bir sayı biçimlendirici var mı?


Yanıtlar:


594

Bulduğum en iyi yöntem aşağıdaki gibi bir şey:

(Bu basit sürümün yalnızca pozitif tamsayılar için çalıştığını unutmayın)

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

Ondalık sayılar için bu kodu kullanabilirsiniz (yine de biraz özensizdir).

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

Son olarak, negatif sayılar olasılığı ile uğraşmak zorundaysanız, işareti saklamak, biçimlendirmeyi sayının mutlak değerine uygulamak ve işareti gerçeğin ardından tekrar uygulamak en iyisidir. Bu yöntemin sayıyı toplam 2 basamakla sınırlamadığını unutmayın. Bunun yerine, yalnızca ondalık sayının solundaki sayıyı kısıtlar (tam sayı kısmı). (İşareti belirleyen satır burada bulundu ).

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


4
@KeithPower bu demo bunu göstermiyor
Joseph Marikle

1
@KeithPower İşte yukarıdaki yöntemi gösteren bir demo: jsfiddle.net/bkTX3 . Kutuyu tıklayın, değeri değiştirin ve çalışırken görmek için kutuyu tıklayın.
Joseph Marikle

1
@Joseph .75 ile 75 yılında dönüşür
galled

@ Normalde tecrübelerime göre bu biçimlendirme biçiminde bu tür bir şeye ihtiyaç duyulmadığını hatırlattı, ancak bu senaryoyu kapsayacak bir düzenleme yaptım.
Joseph Marikle

Ayrıca w3schools.com/jsref/jsref_toprecision.asp.toPrecision() yöntemine bir göz atın
Oleg

133

Sayı 9'dan büyükse, sayıyı bir dizeye (tutarlılık) dönüştürün. Aksi takdirde, sıfır ekleyin.

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

n( 9); //Returns "09"
n(10); //Returns "10"
n(999);//Returns "999"

4
ne negatif zaman olsa. 0-1: 20: 00
mjwrazor

132

Herhangi bir sayıda toLocaleString () yöntemini kullanın. Böylece, aşağıda görüldüğü gibi 6 sayısı için istenen sonuçları alabilirsiniz.

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

'06' dizesini oluşturur.


17
Bu kesinlikle dizeleri elle kesmekten daha iyidir. Daha özlü bir şekilde ve sayfanız ABD dışında kullanılabilirse, bunu yapmak için aşağıdakileri yapmak isteyebilirsiniz:(6).toLocaleString(undefined, {minimumIntegerDigits: 2})
Mark Slater

2
Bunu IE 9 ile kullanmak 06 yerine 6.00 oluşturur.
Drew

1
Çalışıyor, ancak IE'ye ihtiyacınız var> = 11.
Saftpresse99

veya intl.js polyfil ile
maxisam

3
Ben IE yok saymak için hazırım, ama mobil tarayıcılarda iyi desteklenmiyor. src: developer.mozilla.org/tr/docs/Web/JavaScript/Reference/…
chetan92

50

İşte genellikle kullandığım basit bir sayı doldurma işlevi. Herhangi bir miktarda dolguya izin verir.

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

Örnekler:

leftPad(1, 2) // 01
leftPad(10, 2) // 10
leftPad(100, 2) // 100
leftPad(1, 3) // 001
leftPad(1, 8) // 00000001

Ayrıca olumsuz zaman ile ilgili sorunları var. Bunun için bir düzeltme var mı?
mjwrazor

39

Tüm modern tarayıcılarda kullanabilirsiniz

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



Ayrıca düğümün bazı eski sürümlerinde çalışmaz (muhtemelen düğüm 8'den daha eski bir şey)
JSilv

20

@ Lifehack'ın yanıtı benim için çok faydalı oldu; pozitif sayılar için tek bir satırda yapabileceğimizi düşünüyorum

 String(input).padStart(2, '0');

12
("0" + (date.getMonth() + 1)).slice(-2);
("0" + (date.getDay())).slice(-2);

1
Sanırım ayın gününü almak için aşağıdakileri kastediyordun:("0" + (date.getDate())).slice(-2);
Jeff Moeller

11

Yapabilirsin:

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

Misal:

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 />');

Sonuç:

00
01
02
10
15

8

Görünüşe göre bir sayı yerine bir dizeniz olabilir. bunu kullan:

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

İşte bir örnek: http://jsfiddle.net/xtgFp/


7

Hızlı ve kirli bir astar ....

function zpad(n, len) {
  return 0..toFixed(len).slice(2,-n.toString().length)+n.toString();
}

1
Mükemmel iş. Bunu böyle bir uzantı yöntemi olarak kullanmak daha iyidir:Number.prototype.leftPad = String.prototype.leftPad = function (pad) { return 0..toFixed(pad).slice(2, -this.toString().length) + this.toString(); };
ConductedClever

6

Bu basit ve oldukça iyi çalışıyor:

function twoDigit(number) {
  var twodigit = number >= 10 ? number : "0"+number.toString();
  return twodigit;
}

1
şu şekilde yazılabilir: dönüş numarası> = 10? sayı: "0" + number.toString ();
apfz

6

İşte benim için iyi çalışan çok basit bir çözüm.

Önce numaranızı tutacak bir değişken bildirin.

var number;

Şimdi sayıyı bir dizeye dönüştürün ve başka bir değişkende tutun;

var numberStr = number.toString();

Şimdi bu dizenin uzunluğunu test edebilirsiniz, eğer istenenden azsa başlangıçta 'sıfır' ekleyebilirsiniz.

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

Şimdi numarayı istediğiniz gibi kullanın

console.log(number);

6

İşte bulduğum en kolay çözüm: -

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

5

Önceki yanıtın geliştirilmiş sürümü

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


5

Bunun eski bir yazı olduğunu biliyorum, ama daha esnek ve OO çözüm seçeneği sunmak istedim.

Kabul edilen cevabı biraz tahmin ettik ve Numberayarlanabilir sıfır doldurmaya izin vermek için javascript nesnesini uzattım:

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"

Düzenle: İstediğiniz rakamlardan daha uzun sayıların kesilmesini önlemek için kod ekleyin.

NOT: Bu, IE dışında tümüyle geçersizdir. padStart()Bunun yerine kullanın .


4

JavaScript için yerleşik bir sayı biçimlendirici yoktur, ancak bunu yapan bazı kütüphaneler vardır:

  1. underscore.string bir sprintf işlevi sağlar (diğer birçok yararlı biçimlendiriciyle birlikte)
  2. javascript-sprintf , hangi alt çizgi. dizeleri ödünç alır.

3

veya

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

ile

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

3

Basamaklarınızı aynı anda sınırlamak istiyorsanız:

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

Bu, iki basamağı aşan herhangi bir değeri de keser. Bunu fanaur'un çözümü üzerine genişletiyorum.


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>

2

İşte herhangi bir sayıda basamak için çalışan basit bir özyinelemeli çözüm.

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

2

Projenizde lodash yoksa, sadece bir işlevi kullanmak için tüm kütüphaneyi eklemek aşırı derecede olacaktır. Bu, şimdiye kadar gördüğüm probleminizin en sofistike çözümü.

_.padStart(num, 2, '0')

2

Biçimlendirilmiş basit bir tarihe ihtiyaç duyduğumda çağırdığım oldukça basit bir biçim işlevi oluşturdum. Tek basamakları 10'dan küçük olduklarında çift basamaklara biçimlendirmekle ilgilenir.Sat Sep 29 2018 - 00:05:44

Bu işlev, utils değişkeninin bir parçası olarak kullanılır;

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

1

İşte benim versiyonum. Diğer senaryolara kolayca uyarlanabilir.

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

1
    function colorOf(r,g,b){
  var f = function (x) {
    return (x<16 ? '0' : '') + x.toString(16) 
  };

  return "#" +  f(r) + f(g) + f(b);
}

Sadece yanıtlarınıza kod yazmak için değil, bir bağlam eklemeyi de düşünmelisiniz.
Mike

1

Zaman farkına sahip olmak ve negatif sayılar alabilecek sonuçlara sahip olmak isteyen herkes için iyi bir şeydir. yastık (3) = "03", yastık (-2) = "-02", yastık (-234) = "-234"

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

1

bu işlevle istediğiniz herhangi bir n basamağı ile yazdırabilirsiniz

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

1

benim örneğim :

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

1

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

Regex en iyisidir.


Bu, Joe'nun yukarıdaki cevabı ile hemen hemen aynı görünüyor . Lütfen yanıtınızı iyileştirmek için ek bilgi eklemeyi veya tamamen silmeyi düşünün.
Ethan

1

JavaScript AS veri türü değeri sonra 10 o zaman dize marka tarafından kendisine önce 0 eklemek az ise o 04 4 olarak kullanın koşullu ifadesi davranır dinamik belirlenir , Örn

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

1

ES6 Ok İşlevleri için güncellendi (Hemen hemen tüm modern tarayıcılarda desteklenir, bkz. CanIUse )

const formatNumber = n => ("0" + n).slice(-2);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.