Baştaki sıfırlarla bir değeri nasıl doldurabilirim?


395

JavaScript'te bir değeri sıfırla doldurmanın önerilen yolu nedir? Ben daktilo bir değere sıfır pad için özel bir işlev inşa hayal, ama bunu yapmak için daha doğrudan bir yol olup olmadığını merak ediyorum?

Not: "Sıfır dolgulu" ile kastedilen kelime anlamında (burada 5 rakamının 6 haneli sıfır dolgulu gösterimi "000005" olacaktır).


Bu gerçekten cevaplamak için yeterli bilgi değil. "Sıfır doldurma" nın en yaygın örneği muhtemelen tarihlere sıfırlar eklemektir: 5/1/2008> 05/01/2008. Demek istediğin bu mu?
Triptik

6
Düğüm uygulamaları için, kullanın npm install sprintf-jsve ihtiyacınız olan dosyaya gereksinim sprintf('%0d6', 5);
duyun

function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;} ... nolumsuz olmadığı varsayılarak
Paolo

@Paolo, n sayısalsa bu işlev çalışmaz. Daha önce dize n dönüştürmek gerekiyordu whileerişimi içinn.length
Nick F

1
Math veya While döngüleri veya kütüphaneleri olmayan bir astar? mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Adam Whateverson

Yanıtlar:


226

Okuyucular için not!

Yorum yapanların işaret ettiği gibi, bu çözüm "zekidir" ve zeki çözümler sıklıkla olduğu gibi, bellek yoğun ve nispeten yavaştır. Performans sizin için önemliyse, bu çözümü kullanmayın!

Potansiyel olarak modası geçmiş : ECMAScript 2017,ECMAScript 3.1'den beri String.prototype.padStart ve Number.prototype.toLocaleString var. Misal:

var n=-0.1;
n.toLocaleString('en', {minimumIntegerDigits:4,minimumFractionDigits:2,useGrouping:false})

... "-0000.10" çıktısını verir.

// or 
const padded = (.1+"").padStart(6,"0");
`-${padded}`

... "-0000.1" çıktısı verir.

Tek ihtiyacınız olan basit bir işlev

function zeroFill( number, width )
{
  width -= number.toString().length;
  if ( width > 0 )
  {
    return new Array( width + (/\./.test( number ) ? 2 : 1) ).join( '0' ) + number;
  }
  return number + ""; // always return a string
}

ad alanını veya herhangi bir şeyi korumak istiyorsanız, bunu bir kitaplığa dönüştürebilirsiniz. JQuery'nin uzantısı gibi .


1
Şimdi sadece 50.1234 gibi sayılara dikkat etmeniz gerekiyor ve aşağıdaki çözümümün okunabilir bir versiyonuna sahipsiniz! Ancak, biz sadece dolgu değil, genel dolgu sol olduğunu varsayalım.
coderjoe

7
Bir değeri her doldurmak istediğinizde yeni bir dizi oluşturma hayranı değil. Okuyucular, bunların büyük sayılarını yapıyorlarsa potansiyel bellek ve GC etkisinin farkında olmalıdırlar (örneğin, saniyede bu işlemlerin 1000'ini yapan bir node.js sunucusunda. @ Profitehlolz'un cevabı daha iyi bir çözüm gibi görünüyor. .)
broofa

6
Bu negatif değerler için çalışmaz: zeroFill (-10, 7) -> "0000-10"
digitalbath

2
En iyi üç yanıt arasında performans ölçümü: jsperf.com/left-zero-pad
tomsmeding

12
ECMAScript 2017 itibariyle, yerleşik bir padStart işlev var .
Tomas Nikodym

321

Basit yol. Ped için dize çarpımı ekleyebilir ve bir işleve dönüştürebilirsiniz.

var pad = "000000";
var n = '5';
var result = (pad+n).slice(-pad.length);

İşlev olarak,

function paddy(num, padlen, padchar) {
    var pad_char = typeof padchar !== 'undefined' ? padchar : '0';
    var pad = new Array(1 + padlen).join(pad_char);
    return (pad + num).slice(-pad.length);
}
var fu = paddy(14, 5); // 00014
var bar = paddy(2, 4, '#'); // ###2

95
Bu çok güzel bir çözüm, gördüğüm en iyisi. Açıklık için, dakika biçimlendirmesinde dakikaları doldurmak için kullandığım daha basit bir sürüm: ('0' + dakika) .slice (-2)
Luke Ehresman

17
Bu, while döngüsüyle uygulamadan 5 kat daha yavaştır: gist.github.com/4382935
andrewrk

42
Bu, beklenenden daha büyük bir FATAL FLAW'a sahiptir - bu son derece yaygın bir durumdur. Örneğin, paddy (888, 2)verim 88ve gerektiği 888gibi değil . Bu cevap ayrıca negatif sayıları da ele almaz.
Brock Adams

8
@BrockAdams, sıfır dolgu genellikle sabit genişlik sayısı / biçimlendirme durumları için kullanılır - bu nedenle 2 basamaklı sıfır doldurma yapmaya çalışırken 3 basamaklı bir sayı verilirse aslında daha az olası (veya sorun olmayan) olacağını düşünüyorum.
Seaux

1
("000000" + somenum) .substr (-6,6), burada sıfır sayısı ve -6,6, ped genişliğine karşılık gelir. Aynı fikir ama dilim bir daha az param alır; dilimin alt öğeden daha hızlı veya daha yavaş olduğundan emin değilim. Tabii ki benim çözümüm değişken atamaya ihtiyaç duymuyor.
slartibartfast

315

Buradaki tüm karmaşık cevaplara inanamıyorum ... Sadece şunu kullanın:

var zerofilled = ('0000'+n).slice(-4);

27
Negatif sayılar ve 4 basamaktan uzun sayılar hariç.
wberry

12
@wberry bunun üretime hazır kod olması amaçlanmamıştı, ancak sorunun çözülmesine ilişkin temel bilgilerin daha basit bir açıklamasıydı. Aka, bir sayının pozitif veya negatif olup olmadığını belirlemek ve gerekirse uygun işareti eklemek çok kolaydır, bu yüzden kolay örneğimi bununla kümelemek istemedim. Ayrıca, bağımsız değişken olarak basamak uzunluğunu alan ve sabit kodlu değerlerim yerine bunu kullanan bir işlevi yapmak da kolaydır.
Seaux

5
@Seaux, dediniz ki: "tüm karmaşık cevaplara inanamıyorum" ve sonra yorum yaparken kendinize karmaşıklığı açıklamaya başladı. Bu, cevabınızın mükemmel olmadığı perspektifler olduğunu anladığınız anlamına gelir. Dolayısıyla karmaşıklık.
Om Shankar

2
@OmShankar tarafından "karmaşık cevaplar", açıklamamış veya ayrıntılı cevaplar atıfta bulunmuyordum (cevabım olmasa bile bu sitede açıkça teşvik ediliyor), ancak gereksiz kod karmaşıklığı içeren cevaplar.
Seaux

7
Bu cevabı beğendim. Kendi özel durumumda, sayıların her zaman pozitif olduğunu ve asla 3 basamaktan fazla olmadığını biliyorum ve bu genellikle önde 0'larla doldurduğunuzda ve girdiniz iyi bilindiğinde geçerlidir. Güzel!
Patrick Chu

110

Aslında son zamanlarda böyle bir şey bulmak zorundaydım. Döngüler kullanmadan bunu yapmanın bir yolu olması gerektiğini düşündüm.

Ben de bunu buldum.

function zeroPad(num, numZeros) {
    var n = Math.abs(num);
    var zeros = Math.max(0, numZeros - Math.floor(n).toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( num < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

Sonra sadece sıfıra bir sayı sağlayarak kullanın:

> zeroPad(50,4);
"0050"

Sayı dolgudan daha büyükse, sayı dolgudan sonra genişler:

> zeroPad(51234, 3);
"51234"

Ondalık sayılar da iyidir!

> zeroPad(51.1234, 4);
"0051.1234"

Genel ad alanını kirletmekten sakıncası yoksa, doğrudan Sayıya ekleyebilirsiniz:

Number.prototype.leftZeroPad = function(numZeros) {
    var n = Math.abs(this);
    var zeros = Math.max(0, numZeros - Math.floor(n).toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( this < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

Ve ondalık sayıların dolguda yer kaplamasını tercih ediyorsanız:

Number.prototype.leftZeroPad = function(numZeros) {
    var n = Math.abs(this);
    var zeros = Math.max(0, numZeros - n.toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( this < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

Şerefe!



XDR , daha iyi performans gösteren bir logaritmik varyasyon ortaya koydu.

UYARI : num sıfıra eşitse bu işlev başarısız olur (örn. Zeropad (0, 2))

function zeroPad (num, numZeros) {
    var an = Math.abs (num);
    var digitCount = 1 + Math.floor (Math.log (an) / Math.LN10);
    if (digitCount >= numZeros) {
        return num;
    }
    var zeroString = Math.pow (10, numZeros - digitCount).toString ().substr (1);
    return num < 0 ? '-' + zeroString + an : zeroString + an;
}

Performanstan bahsetmişken, tomsmeding ilk 3 cevabı karşılaştırdı ( 4 log varyasyonu ile ). Tek Bil ki Majorly diğer ikisini geride bırakmıştır? :)


9
Bu iyi, nasıl okunabilir ve sağlam olduğunu seviyorum. Değiştireceğim tek şey numZeros, yanıltıcı olduğundan parametrenin adıdır . Eklemek istediğiniz sıfır sayısı değil, sayının olması gereken minimum uzunluk. Daha iyi bir isim numLengthya da çift olurdu length.
12'de

13
+1. Daha yüksek oylanan cevapların aksine, bu negatif sayıları ele alır ve taşma brüt hataları döndürmez !!?!
Brock Adams

10
En iyi üç yanıt arasında performans ölçümü: jsperf.com/left-zero-pad
tomsmeding

4
Logaritma kullanarak bu cevabın performansını% 100'ün üzerinde artırdım. Lütfen http://jsperf.com/left-zero-pad/10
XDR

2
Orijinal çözüm daha iyi, numsıfır olabilirse logaritmik varyasyon çalışmıyor ...
Ondra C.Mar

69

İşte 7 karaktere kadar bir sayıyı doldurmak için kullandım.

("0000000" + number).slice(-7)

Bu yaklaşım muhtemelen çoğu insan için yeterli olacaktır.

Düzenleme: Daha genel hale getirmek istiyorsanız, bunu yapabilirsiniz:

("0".repeat(padding) + number).slice(-padding)

Edit 2: ES2017'den bu yana şunları kullanabileceğinizi unutmayın String.prototype.padStart:

number.toString().padStart(padding, "0")

Bu, büyük sayılarda ve negatif sayılarda kötü bir şekilde başarısız olur. number = 123456789, yukarıdaki kodla, örneğin.
Brock Adams

Bu çözüm, bazı senaryolar için mümkün olan en iyi çözümdür! Bunu daha önce neden bulamadığımız hakkında hiçbir fikrim yok. Senaryo şu şekildedir: [Brock'un belirttiği gibi] her zaman pozitif olan bir numaranız var ve sınırınızdan daha fazla karakter almayacağını biliyorsunuz. Bizim durumumuzda Amazon SDB'de sakladığımız bir puanımız var. Bildiğiniz gibi SDB sayıları karşılaştıramaz, bu nedenle tüm puanlar sıfır dolgulu olmalıdır. Bu son derece kolay ve etkilidir!
Krystian

4
Özür dilerim, bunun negatif sayılar için işe yaramayacağını söylemeliydim. Bence bu daha yaygın pozitif sayı davasıyla ilgileniyor. En azından ihtiyacım olanı yapıyor!
chetbox

Bunu tekrar gerekli ve ihtiyacınız olmadığını fark etti new String. Sadece dizgi değişmezlerini kullanabilirsiniz.
chetbox

3
(new Array(padding + 1).join("0")ile değiştirilebilir"0".repeat(padding)
Pavel

34

Modern tarayıcılar artık destekliyor padStart, şunları yapabilirsiniz:

string.padStart(maxLength, "0");

Misal:

string = "14";
maxLength = 5; // maxLength is the max string length, not max # of fills
res = string.padStart(maxLength, "0");
console.log(res); // prints "00014"


@Flimm cevabı düzenlemekten çekinmeyin :) 4 yıl önce yazıldı, bu yüzden eminim şimdi işler değişti
Sterling Archer

27

Ne yazık ki, bu sorun için genellikle matematik veya dize manipülasyonu yapmak veya üçüncü taraf bir yardımcı program çağırmak için kendi işlevinizi yazmayı içeren çok fazla gereksiz karmaşık öneri vardır. Ancak, bunu temel JavaScript kitaplığında yalnızca bir satır kodla yapmanın standart bir yolu vardır. Yerel ad veya stil gibi asla değiştirmek istemediğiniz parametreleri belirtmekten kaçınmak için bu kod satırını bir işleve sarmaya değer olabilir.

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumIntegerDigits: 3,
    useGrouping: false
});

Bu metin için "005" değerini üretecektir. Ondalık virgülünün sağ tarafındaki sıfırları doldurmak için Sayı'nın toLocaleString işlevini de kullanabilirsiniz.

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumFractionDigits: 2,
    useGrouping: false
});

Bu metin için "5.00" değerini üretecektir. Binlerce virgül ayırıcı kullanmak için useGrouping öğesini true olarak değiştirin.

Kullanarak unutmayın toLocaleString()ile localesve optionsargümanlar ECMA-402 ayrı standardize edilmiştir değil ECMAScript'te. Bugün itibariyle, bazı tarayıcılar yalnızca temel desteği uygulamaktadır , yani toLocaleString()herhangi bir argümanı yoksayabilir.

Komple Örnek


Vay be, bu süper temiz bir çözüm ve node.js'de çalışıyor.
jishi

"Gereksiz karmaşık öneriler" girişini okuduğumda kıkırdadım. Yazılım geliştirme, tüm mühendislik disiplinlerinde olduğu gibi, tartım değişimlerini içerir. Bu "standart yolu" kendim denedim - ve zamanladım. Kesinlikle işe yarıyor, ancak diğer "ev haddelenmiş" çözümlerin çoğuna kıyasla ne kadar yavaş olduğu için hiçbir zaman tekrarlayan uygulama için kullanmayı asla tercih etmem.
bearvarine

1
Doğru, birçok yerleşik JavaScript işlevi, çok fazla veri üzerinde döngü yaparken kötü performans gösteriyor, ancak Node.js gibi sunucu tarafı için bile JavaScript kullanmamanız gerektiğini iddia ediyorum. Sunucu tarafı işlemek için çok fazla veri varsa, .NET veya Java gibi daha iyi bir platform kullanmalısınız. Son kullanıcı için görüntüleme için istemci tarafı verileri işliyorsanız, yalnızca son kullanıcının ekranına oluşturmakta olduğunuz veriyi işlemelisiniz. Örneğin, bir tablonun yalnızca görünür satırlarını oluşturun ve diğer yollar için verileri işlemeyin.
Daniel Barbalace

21

Dolgu numarasının önceden belirli bir değeri aşmadığı biliniyorsa, bunu döngüsüz yapmanın başka bir yolu vardır:

var fillZeroes = "00000000000000000000";  // max number of zero fill ever asked for in global

function zeroFill(number, width) {
    // make sure it's a string
    var input = number + "";  
    var prefix = "";
    if (input.charAt(0) === '-') {
        prefix = "-";
        input = input.slice(1);
        --width;
    }
    var fillAmt = Math.max(width - input.length, 0);
    return prefix + fillZeroes.slice(0, fillAmt) + input;
}

Test örnekleri burada: http://jsfiddle.net/jfriend00/N87mZ/


@BrockAdams - bahsettiğiniz her iki durum için de düzeltildi. Sayı zaten dolgu genişliği kadar genişse, dolgu eklenmez.
jfriend00

Teşekkürler; +1. Bununla birlikte, negatif sayılar olağan sözleşmeden biraz uzakta. Test durumunuzda, örneğin -88verim vermelidir "-00088".
Brock Adams

1
@BrockAdams - Ben çağırarak emin olmadığı idi zeroFill(-88, 5)üretmelidir -00088ya -0088? Sanırım widthargümanın sayının tüm genişliği mi yoksa sadece rakam sayısı mı (negatif işaret dahil değil) olmasına bağlı. Bir uygulayıcı, yalnızca --widthkod satırını kaldırarak davranışı olumsuz işareti içermeyecek şekilde kolayca değiştirebilir .
jfriend00

19

Hızlı ve kirli yol:

y = (new Array(count + 1 - x.toString().length)).join('0') + x;

X = 5 ve count = 6 için y = "000005"


1
y="0005"Yukarıdakileri aldım y = (new Array(count + 1 - x.toString().length)).join('0') + x;, bana ne verdiy="000005"
forforf

3
@OrrSiloni: En kısa kod çözümü aslında('0000'+n).slice(-4)
Seaux

14

İşte işi yapmak için bulduğum hızlı bir işlev. Herkes daha basit bir yaklaşıma sahipse, paylaşmaktan çekinmeyin!

function zerofill(number, length) {
    // Setup
    var result = number.toString();
    var pad = length - result.length;

    while(pad > 0) {
        result = '0' + result;
        pad--;
    }

    return result;
}

Ben "daha basit" bir çözüm olacağını sanmıyorum - bu her zaman bir tür bir işlev olacaktır. Bir algoritma tartışması yapabiliriz, ancak günün sonunda yine de bir sayıyı sıfırlayan bir işlev elde edersiniz.
Peter Bailey

Genel tavsiyem, "for" döngülerini ECMAScript dillerinde (ActionScript 1-3 ve JavaScript) genellikle daha kararlı ve hızlı oldukları için kullanmaktır
cwallenpoole 12:09

Veya yinelemeyi tamamen atlayın;)
Peter Bailey

Daha basit fonksiyon? Muhtemelen değil. Dönmeyen bir tane mi? Bu mümkün ... algoritma tamamen önemsiz olmasa da.
coderjoe

1
Vay be, hemen hemen tüm yorumlar yanlış. @ profitehlolz'un çözümü basittir ve satır içi işlem için uygundur (bir işlev olması gerekmez). Bu arada, for.vs. whileperformans ilginç olacak kadar farklı değil: jsperf.com/fors-vs-while/34
broofa

12

Buradaki partiye geç, ama genellikle bu yapıyı n, pozitif, ondalık olduğu bilinen bazı değerlerin geçici olarak doldurulması için kullanıyorum:

(offset + n + '').substr(1);

offset10 ^ ^ basamak nerede .

5 basamaklı dolgu, burada n = 123:

(1e5 + 123 + '').substr(1); // => 00123

Bunun onaltılık versiyonu biraz daha ayrıntılıdır:

(0x100000 + 0x123).toString(16).substr(1); // => 00123

Not 1: Dilim () 'in şık negatif dizin özelliğini kullanarak, bunun dize sürümü olan @ profitehlolz çözümünü de seviyorum.


12

Nedenini gerçekten bilmiyorum, ama kimse bunu en açık şekilde yapmadı. İşte benim uygulamam.

İşlev:

/** Pad a number with 0 on the left */
function zeroPad(number, digits) {
    var num = number+"";
    while(num.length < digits){
        num='0'+num;
    }
    return num;
}

Prototip:

Number.prototype.zeroPad=function(digits){
    var num=this+"";
    while(num.length < digits){
        num='0'+num;
    }
    return(num);
};

Çok basit, bunun nasıl daha basit olabileceğini hiçbir şekilde göremiyorum. Bir sebepten ötürü burada SO'da birçok kez göründüm, insanlar sadece 'için' ve 'iken' döngülerden kaçınmaya çalışıyorlar. Normal ifade kullanmak, bu kadar önemsiz bir 8 basamaklı dolgu için muhtemelen daha fazla döngüye mal olacaktır.


11

Bu parçacığı 5 basamaklı gösterim almak için kullanıyorum

(value+100000).toString().slice(-5) // "00123" with value=123


9

Matematiğin gücü!

x = ped için tam sayı
y = ped için sıfır sayısı

function zeroPad(x, y)
{
   y = Math.max(y-1,0);
   var n = (x / Math.pow(10,y)).toFixed(y);
   return n.replace('.','');  
}

9

Ben kimse String.prototype.substr () kullandığınızı işaret görmedim negatif bir sayı ile .

OP sorusuna bir numaralı çözüm, 5 sayısının 6 haneli sıfır doldurulmuş bir temsili:

console.log(("00000000" + 5).substr(-6));

Genel olarak elde edeceğiz:

function pad(num, len) { return ("00000000" + num).substr(-len) };

console.log(pad(5, 6));
console.log(pad(45, 6));
console.log(pad(345, 6));
console.log(pad(2345, 6));
console.log(pad(12345, 6));


8

Bu soruların cevaplarında bulunan 15 farklı fonksiyon / yöntemi test eden bir, uzun, uzun bir süre sonra, hangisinin en iyi olduğunu (en çok yönlü ve en hızlı) biliyorum.

Bu sorunun cevabından 15 fonksiyon / yöntem aldım ve 100 ped yürütmek için harcanan zamanı ölçmek için bir senaryo hazırladım. Ped numarası Her ped olur 9ile 2000sıfır. Bu aşırı görünebilir ve öyledir, ancak işlevlerin ölçeklendirilmesi hakkında size iyi bir fikir verir.

Kullandığım kodu burada bulabilirsiniz: https://gist.github.com/NextToNothing/6325915

Kodu kendiniz değiştirip test etmekten çekinmeyin.

En çok yönlü yöntemi elde etmek için bir döngü kullanmanız gerekir. Bunun nedeni, çok büyük sayılarda başkalarının başarısız olma olasılığıdır, oysa bu başarılı olacaktır.

Hangi döngü kullanılacak? Bu bir whiledöngü olurdu . Bir fordöngü hala hızlıdır, ancakwhile döngü biraz daha hızlı (birkaç ms) ve daha temiz.

Tarafından olduğu gibi Cevapları Wilco, Aleksandar ToplekyaVitim.us mükemmel iş yapacak.

Şahsen farklı bir yaklaşım denedim. Dize / sayı pad için özyinelemeli bir işlev kullanmaya çalıştım. Bir diziye katılma yöntemlerinden daha iyi sonuç verdi, ancak yine de for döngüsü kadar hızlı çalışmadı.

Benim fonksiyonum:

function pad(str, max, padder) {
  padder = typeof padder === "undefined" ? "0" : padder;
  return str.toString().length < max ? pad(padder.toString() + str, max, padder) : str;
}

İşlevimi dolgu değişkenini ayarlayarak veya bu ayar olmadan kullanabilirsiniz. Şöyle böyle:

pad(1, 3); // Returns '001'
// - Or -
pad(1, 3, "x"); // Returns 'xx1'

Şahsen, testlerimden sonra, bir while döngüsüne sahip bir yöntem kullanacağım, Aleksandar Toplekya da Vitim.us. Ancak, dolgu dizesini ayarlayabilmeniz için biraz değiştiririm.

Yani, bu kodu kullanırdım:

function padLeft(str, len, pad) {
    pad = typeof pad === "undefined" ? "0" : pad + "";
    str = str + "";
    while(str.length < len) {
        str = pad + str;
    }
    return str;
}

// Usage
padLeft(1, 3); // Returns '001'
// - Or -
padLeft(1, 3, "x"); // Returns 'xx1'

Bu kodu kullanarak bir prototip işlevi olarak da kullanabilirsiniz:

Number.prototype.padLeft = function(len, pad) {
    pad = typeof pad === "undefined" ? "0" : pad + "";
    var str = this + "";
    while(str.length < len) {
        str = pad + str;
    }
    return str;
}

// Usage
var num = 1;

num.padLeft(3); // Returns '001'
// - Or -
num.padLeft(3, "x"); // Returns 'xx1'

Kodun sürümünüzü ekleyerek başkalarının test etmesini hızlandırmak için bunu bir jsfiddle'a koydum: jsfiddle.net/kevinmicke/vnvghw7y/2 Sürümünüz her zaman çok rekabetçi ve bazen en hızlı. Oldukça kapsamlı testler için teşekkürler.
kevinmicke

8

Birinci parametre herhangi bir gerçek sayıdır, ikinci parametre ondalık noktasının solundaki minimum basamak sayısını belirten pozitif bir tamsayıdır ve üçüncü parametre ondalık noktasının sağındaki basamaklarsa sayıyı belirten isteğe bağlı bir pozitif tamsayıdır.

function zPad(n, l, r){
    return(a=String(n).match(/(^-?)(\d*)\.?(\d*)/))?a[1]+(Array(l).join(0)+a[2]).slice(-Math.max(l,a[2].length))+('undefined'!==typeof r?(0<r?'.':'')+(a[3]+Array(r+1).join(0)).slice(0,r):a[3]?'.'+a[3]:''):0
}

yani

           zPad(6, 2) === '06'
          zPad(-6, 2) === '-06'
       zPad(600.2, 2) === '600.2'
        zPad(-600, 2) === '-600'
         zPad(6.2, 3) === '006.2'
        zPad(-6.2, 3) === '-006.2'
      zPad(6.2, 3, 0) === '006'
        zPad(6, 2, 3) === '06.000'
    zPad(600.2, 2, 3) === '600.200'
zPad(-600.1499, 2, 3) === '-600.149'


8

Bu ES6 çözümüdür.

function pad(num, len) {
  return '0'.repeat(len - num.toString().length) + num;
}
alert(pad(1234,6));


Açıkçası en zarif çözüm ben sadece 2 dize dönüşümleri önlemek için değiştirmek istiyorum: const numStr = String(num)andreturn '0'.repeat(len - numStr.length) + numStr;
ngryman

8

Tüm modern tarayıcılarda kullanabilirsiniz

numberStr.padStart(numberLength, "0");

function zeroFill(num, numLength) {
  var numberStr = num.toString();

  return numberStr.padStart(numLength, "0");
}

var numbers = [0, 1, 12, 123, 1234, 12345];

numbers.forEach(
  function(num) {
    var numString = num.toString();
    
    var paddedNum = zeroFill(numString, 5);

    console.log(paddedNum);
  }
);

İşte MDN referansı https://developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/Global_Objects/String/padStart


5

Bu sorunun daha fazla cevaba ihtiyacı değil, ama bunun basit lodash versiyonunu ekleyeceğimi düşündüm.

_.padLeft(number, 6, '0')


1
Daha iyi:var zfill = _.partialRight(_.padStart, '0');
Droogans

3
Bazı insanlar muhtemelen "Lodash kullanmak istemiyorum" protesto edecek ama sadece bu işlevi yükleyebilirsiniz çünkü artık geçerli bir argüman:: npm install --save lodash.padlefto zaman import padLeft from 'lodash.padleft've_.
Andy

5

Bunu yapmanın en son yolu çok daha basit:

var number = 2
number.toLocaleString(undefined, {minimumIntegerDigits:2})

output: "02"


(8).toLocaleString(undefined, {minimumIntegerDigits: 5})"00.008"benim yerime göre, benim için döner .
le_m


4

Bu daha az yerli, ama en hızlı olabilir ...

zeroPad = function (num, count) {
    var pad = (num + '').length - count;
    while(--pad > -1) {
        num = '0' + num;
    }
    return num;
};

bence yapmak istiyorsun pad = count - (num + '').length. negatif sayılar iyi ele alınmaz, ancak bunun dışında kötü değil. +1
nickf

3

Çözümüm

Number.prototype.PadLeft = function (length, digit) {
    var str = '' + this;
    while (str.length < length) {
        str = (digit || '0') + str;
    }
    return str;
};

kullanım

var a = 567.25;
a.PadLeft(10); // 0000567.25

var b = 567.25;
b.PadLeft(20, '2'); // 22222222222222567.25

3

Neden özyineleme kullanmıyorsunuz?

function padZero(s, n) {
    s = s.toString(); // in case someone passes a number
    return s.length >= n ? s : padZero('0' + s, n);
}

padZero (223, 3) '0223' ile başarısız oluyor
Serginho

Eh, bu fonksiyonun ilk parametre olarak bir dize ile çağrıldığını varsaydım. Ancak ben düzelttim.
lex82

2

Bazı maymun sıçraması da işe yarıyor

String.prototype.padLeft = function (n, c) {
  if (isNaN(n))
    return null;
  c = c || "0";
  return (new Array(n).join(c).substring(0, this.length-n)) + this; 
};
var paddedValue = "123".padLeft(6); // returns "000123"
var otherPadded = "TEXT".padLeft(8, " "); // returns "    TEXT"

1
-1 javascript üst düzey ad boşluğu monkeypatch kötü bir uygulamadır.
Jeremy Wall

2
Nesne ve Dizi nesneleri için doğru, ancak Dize kötü değil
Rodrigo

2
function pad(toPad, padChar, length){
    return (String(toPad).length < length)
        ? new Array(length - String(toPad).length + 1).join(padChar) + String(toPad)
        : toPad;
}

pad(5, 0, 6) = 000005

pad('10', 0, 2) = 10 // don't pad if not necessary

pad('S', 'O', 2) = SO

...vb.

Şerefe


Sanırım daha çok olmalı: var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;eğer düzeltirsen aşağı oyumu kaldıracağım.
çekti

@drewish Bunu yakaladığınız için teşekkür ederiz, düzenlemenize katılıyorum (hardcoded 0katılmak char hariç :) - Yanıt güncellendi.
Madbreaks

Dizeyi geçici bir değişkene depolamanın daha iyi olacağını düşünüyorum. Ben burada bazı kıyaslama yaptım: jsperf.com/padding-with-memoization Ayrıca "yeni dizi" de yeni kullanım için kriterleri var yeni için sonuçlar her yerde ama memiozation gitmek gibi görünüyor.
28'de çekti

2

En basit bulacaksınız, en düz İleri çözüm.

function zerofill(number,length) {
    var output = number.toString();
    while(output.length < length) {
      output = '0' + output;
    }
    return output;
}
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.