Bagaimana saya bisa memberi nilai dengan angka nol di depan?

395

Apa cara yang disarankan untuk mengisi ulang nilai dalam JavaScript? Saya membayangkan saya bisa membangun fungsi khusus untuk menempatkan nol pada nilai yang diketikkan, tetapi saya bertanya-tanya apakah ada cara yang lebih langsung untuk melakukan ini?

Catatan: Dengan "zerofilled" yang saya maksudkan dalam arti kata database (di mana representasi 6 digit dari angka 5 adalah "000005").

Wilco
sumber
Ini sebenarnya tidak cukup informasi untuk dijawab. Contoh paling umum dari "zero padding" mungkin adalah mungkin dengan menambahkan nol pada tanggal: 5/1/2008> 05/01/2008. Apakah itu yang Anda maksud?
Triptych
6
Untuk aplikasi simpul, gunakan npm install sprintf-js, dan sprintf('%0d6', 5);
minta
function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;} ... dengan asumsi ntidak negatif
Paolo
@ Paa fungsi yang tidak berfungsi jika n adalah angka Anda harus mengonversi n ke String sebelum whilemengaksesn.length
Nick F
1
Satu liner tanpa matematika atau loop sementara atau perpustakaan? mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Adam Whateverson

Jawaban:

226

Catatan untuk pembaca!

Seperti yang telah ditunjukkan oleh para komentator, solusi ini "pintar", dan seperti yang sering dilakukan oleh solusi cerdas, intensif ingatan dan relatif lambat. Jika kinerja menjadi perhatian Anda, jangan gunakan solusi ini!

Berpotensi ketinggalan zaman : ECMAScript 2017 menyertakan String.prototype.padStart dan Number.prototype.toLocaleString ada sejak ECMAScript 3.1. Contoh:

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

... akan menampilkan "-0000.10".

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

... akan menampilkan "-0000.1".

Yang Anda butuhkan hanyalah fungsi sederhana

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
}

Anda bisa memanggang ini ke perpustakaan jika Anda ingin menghemat namespace atau apa pun. Seperti dengan ekstensi jQuery .

Peter Bailey
sumber
1
Sekarang Anda hanya perlu mengurus angka-angka seperti 50.1234 dan Anda punya versi yang dapat dibaca dari solusi saya di bawah ini! Namun, saya berasumsi bahwa kami hanya dibiarkan padding, bukan padding keseluruhan.
coderjoe
7
Bukan penggemar membuat array baru setiap kali Anda ingin memberi nilai. Pembaca harus sadar akan potensi memori dan dampak GC jika mereka melakukan # # besar dari ini (misalnya pada server node.js yang melakukan 1000 dari operasi ini per detik. @ Profitehlolz jawaban tampaknya akan menjadi solusi yang lebih baik .)
broofa
6
Ini tidak berfungsi untuk nilai negatif: zeroFill (-10, 7) -> "0000-10"
digitalbath
2
Ukuran kinerja di antara tiga jawaban teratas di sini: jsperf.com/left-zero-pad
tomsmeding
12
Pada ECMAScript 2017, ada fungsi padStart bawaan .
Tomas Nikodym
321

Cara sederhana. Anda bisa menambahkan perkalian string untuk pad dan mengubahnya menjadi fungsi.

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

Sebagai suatu fungsi,

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
profitehlolz
sumber
95
Ini adalah solusi yang sangat bagus, terbaik yang pernah saya lihat. Untuk kejelasan, inilah versi yang lebih sederhana yang saya gunakan untuk mengisi menit dalam format waktu: ('0' + menit) .slice (-2)
Luke Ehresman
17
Ini 5 kali lebih lambat daripada implementasi dengan loop sementara: gist.github.com/4382935
andrewrk
42
Ini memiliki cacat FATAL dengan angka lebih besar dari yang diharapkan - yang merupakan kejadian yang sangat umum. Misalnya, paddy (888, 2)hasil 88dan tidak 888sesuai kebutuhan. Jawaban ini juga tidak menangani angka negatif.
Brock Adams
8
@BrockAdams, zerofill biasanya digunakan untuk kasus angka / format lebar tetap - oleh karena itu saya pikir itu sebenarnya akan lebih kecil kemungkinannya (atau bahkan bukan masalah) jika diberikan angka 3 digit ketika mencoba untuk melakukan 2 digit angka nol.
Seaux
1
("000000" + somenum). Substr (-6,6) di mana jumlah nol dan -6,6 sesuai dengan lebar pad. Ide yang sama tetapi slice mengambil satu param kurang; tidak yakin apakah slice lebih cepat atau lebih lambat dari pada subtr. Tentu saja solusi saya tidak memerlukan penugasan variabel.
slartibartfast
315

Saya tidak percaya semua jawaban rumit di sini ... Gunakan saja ini:

var zerofilled = ('0000'+n).slice(-4);
Seaux
sumber
27
Baik kecuali untuk angka negatif dan angka lebih dari 4 digit.
wberry
12
@wberry ini tidak dimaksudkan sebagai kode siap produksi, tetapi lebih merupakan penjelasan sederhana tentang dasar-dasar untuk menyelesaikan pertanyaan yang ada. Aka sangat mudah untuk menentukan apakah angka positif atau negatif dan menambahkan tanda yang sesuai jika diperlukan, jadi saya tidak ingin mengelompokkan contoh mudah saya dengan itu. Selain itu, mudah untuk membuat fungsi yang menggunakan digit sebagai arg dan menggunakannya sebagai ganti nilai hardcoded saya.
Seaux
5
@Seaux, Anda berkata: "tidak bisa percaya semua jawaban kompleks" , dan kemudian mulai menjelaskan sendiri kompleksitas ketika berkomentar. Ini berarti Anda memahami bahwa ada beberapa perspektif yang jawabannya tidak sempurna. Karenanya kompleksitas.
Om Shankar
2
@OmShankar oleh "jawaban kompleks", saya tidak merujuk ke jawaban yang dijelaskan atau terinci (yang jelas didorong di situs ini meskipun jawaban saya tidak), melainkan jawaban yang berisi kompleksitas kode yang tidak perlu.
Seaux
7
Saya suka jawaban ini. Dalam kasus spesifik saya sendiri, saya tahu bahwa angka selalu positif dan tidak pernah lebih dari 3 digit, dan ini sering terjadi ketika Anda menggunakan angka 0 dan input Anda sudah dikenal. Bagus!
Patrick Chu
110

Saya benar-benar harus datang dengan sesuatu seperti ini baru-baru ini. Saya pikir pasti ada cara untuk melakukannya tanpa menggunakan loop.

Inilah yang saya pikirkan.

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

Maka cukup gunakan itu memberikan angka ke nol pad:

> zeroPad(50,4);
"0050"

Jika angkanya lebih besar dari padding, angkanya akan meluas melampaui padding:

> zeroPad(51234, 3);
"51234"

Desimal juga baik-baik saja!

> zeroPad(51.1234, 4);
"0051.1234"

Jika Anda tidak keberatan mencemari namespace global, Anda dapat menambahkannya ke Number secara langsung:

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

Dan jika Anda lebih suka desimal, gunakan tempat di padding:

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

Bersulang!



XDR datang dengan variasi logaritmik yang tampaknya berkinerja lebih baik.

PERINGATAN : Fungsi ini gagal jika num sama dengan nol (mis. 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;
}

Berbicara tentang kinerja, ibu membandingkan 3 jawaban teratas ( 4 dengan variasi log ). Tebak mana yang majorly mengungguli dua lainnya? :)

coderjoe
sumber
9
Ini bagus, saya suka cara itu bisa dibaca dan kuat. Satu-satunya hal yang akan saya ubah adalah nama numZerosparameternya, karena itu menyesatkan. Ini bukan jumlah nol yang ingin Anda tambahkan, itu adalah panjang minimum jumlah yang seharusnya. Nama yang lebih baik akan numLengthatau bahkan length.
Senseful
13
+1. Tidak seperti jawaban dengan suara lebih tinggi, yang ini menangani angka negatif dan tidak mengembalikan kesalahan kotor saat melimpah !!?
Brock Adams
10
Ukuran kinerja di antara tiga jawaban teratas di sini: jsperf.com/left-zero-pad
tomsmeding
4
Saya meningkatkan kinerja jawaban ini lebih dari 100% dengan menggunakan logaritma. Silakan lihat test case logaritmik di http://jsperf.com/left-zero-pad/10
XDR
2
Solusi asli lebih baik, variasi logaritmik tidak berfungsi jika numbisa nol ...
Ondra C.
69

Inilah yang saya gunakan untuk memasukkan angka hingga 7 karakter.

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

Pendekatan ini mungkin cukup bagi kebanyakan orang.

Sunting: Jika Anda ingin membuatnya lebih umum, Anda dapat melakukan ini:

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

Sunting 2: Perhatikan bahwa sejak ES2017 Anda dapat menggunakan String.prototype.padStart:

number.toString().padStart(padding, "0")
chetbox
sumber
Ini gagal, buruk, pada jumlah besar dan angka negatif. number = 123456789, dengan kode di atas, misalnya.
Brock Adams
Solusi ini adalah yang terbaik untuk skenario tertentu! Saya tidak tahu mengapa kami tidak membuat ini sebelumnya. Skenarionya adalah: Anda memiliki angka yang selalu positif [seperti yang disebutkan Brock] dan Anda tahu itu tidak akan mengambil lebih banyak karakter daripada batas Anda. Dalam kasus kami, kami memiliki skor yang kami simpan di Amazon SDB. Seperti yang Anda ketahui, SDB tidak dapat membandingkan angka, jadi semua skor harus diisi nol. Ini sangat mudah dan efektif!
Krystian
4
Permintaan maaf, saya seharusnya menyebutkan bahwa ini tidak akan berfungsi untuk angka negatif. Saya pikir ini berkaitan dengan kasus angka positif yang lebih umum. Setidaknya itulah yang saya butuhkan!
chetbox
Membutuhkan ini lagi dan menyadari Anda tidak perlu new String. Anda bisa menggunakan string literal.
chetbox
3
(new Array(padding + 1).join("0")dapat diganti dengan"0".repeat(padding)
Pavel
34

Browser modern sekarang mendukung padStart, Anda sekarang dapat melakukannya:

string.padStart(maxLength, "0");

Contoh:

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
sumber
@ Flimm merasa bebas untuk mengeditnya menjadi jawabannya :) Itu ditulis 4 tahun yang lalu jadi saya yakin semuanya telah berubah sekarang
Sterling Archer
27

Sayangnya, ada banyak saran rumit yang tidak perlu untuk masalah ini, biasanya melibatkan penulisan fungsi Anda sendiri untuk melakukan manipulasi matematika atau string atau memanggil utilitas pihak ketiga. Namun, ada cara standar untuk melakukan ini di pustaka JavaScript dasar hanya dengan satu baris kode. Mungkin pantas untuk membungkus satu baris kode ini dalam suatu fungsi untuk menghindari keharusan menentukan parameter yang tidak ingin Anda ubah seperti nama atau gaya lokal.

var amount = 5;

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

Ini akan menghasilkan nilai "005" untuk teks. Anda juga dapat menggunakan fungsi toLocaleString dari Angka untuk membuat angka nol di sebelah kanan titik desimal.

var amount = 5;

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

Ini akan menghasilkan nilai "5,00" untuk teks. Ubah useGrouping menjadi true untuk menggunakan pemisah koma untuk ribuan.

Perhatikan bahwa penggunaan toLocaleString()dengan localesdan optionsargumen distandarisasi secara terpisah dalam ECMA-402 , bukan dalam ECMAScript. Sampai hari ini, beberapa browser hanya menerapkan dukungan dasar , yaitu toLocaleString()dapat mengabaikan argumen apa pun.

Contoh Lengkap

Daniel Barbalace
sumber
Wow, ini adalah solusi super bersih dan berfungsi di node.js.
jishi
Aku terkekeh ketika membaca intro - "saran rumit yang tidak perlu". Pengembangan perangkat lunak, seperti dalam semua disiplin ilmu teknik, melibatkan penimbangan timbal balik. Saya mencoba "cara standar" ini sendiri - dan menghitung waktunya. Ini benar-benar berfungsi, tetapi saya tidak akan pernah memilih untuk menggunakannya untuk semua jenis aplikasi berulang karena betapa lambatnya dibandingkan dengan banyak solusi "home rolled" lainnya.
bearvarine
1
Benar, banyak fungsi JavaScript built-in berkinerja buruk ketika perulangan banyak data, tapi saya berpendapat Anda tidak boleh menggunakan JavaScript untuk itu, bahkan sisi server seperti Node.js. Jika Anda memiliki banyak data untuk memproses sisi server, Anda harus menggunakan platform yang lebih baik seperti .NET atau Java. Jika Anda memproses data sisi klien untuk ditampilkan kepada pengguna akhir, Anda hanya boleh memproses data untuk apa yang saat ini Anda renderkan ke layar pengguna akhir. Misalnya, render hanya baris yang terlihat dari tabel dan tidak memproses data untuk jalan lain.
Daniel Barbalace
21

Jika nomor pengisian diketahui sebelumnya tidak melebihi nilai tertentu, ada cara lain untuk melakukan ini tanpa loop:

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

Uji kasus di sini: http://jsfiddle.net/jfriend00/N87mZ/

pacar00
sumber
@BrockAdams - diperbaiki untuk kedua kasus yang Anda sebutkan. Jika jumlahnya sudah selebar lebar isian, maka tidak ada isian yang ditambahkan.
jfriend00
Terima kasih; +1. Namun, angka negatifnya sedikit berbeda dari konvensi yang biasa. Dalam kasus pengujian Anda, -88harus menghasilkan "-00088", misalnya.
Brock Adams
1
@ RockAdams - Saya tidak yakin apakah panggilan zeroFill(-88, 5)harus menghasilkan -00088atau -0088? Saya kira itu tergantung pada apakah Anda ingin widthargumen menjadi seluruh lebar angka atau hanya jumlah digit (tidak termasuk tanda negatif). Seorang pelaksana dapat dengan mudah mengubah perilaku untuk tidak menyertakan tanda negatif dengan hanya menghapus --widthbaris kode.
jfriend00
19

Cara cepat dan kotor:

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

Untuk x = 5 dan hitung = 6 Anda akan memiliki y = "000005"

Johann Philipp Strathausen
sumber
1
Saya mendapat y="0005"dengan di atas, y = (new Array(count + 1 - x.toString().length)).join('0') + x;adalah apa yang memberi sayay="000005"
forforf
3
@ OrrSiloni: solusi kode terpendek sebenarnya('0000'+n).slice(-4)
Seaux
14

Inilah fungsi cepat yang saya buat untuk melakukan pekerjaan itu. Jika ada yang memiliki pendekatan yang lebih sederhana, silakan berbagi!

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

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

    return result;
}
Wilco
sumber
Saya tidak berpikir akan ada solusi "sederhana" - itu akan selalu menjadi semacam fungsi. Kita bisa melakukan diskusi algoritme, tetapi pada akhirnya, Anda masih akan berakhir dengan fungsi yang menentukan angka.
Peter Bailey
Saran umum saya adalah menggunakan loop "for" karena mereka umumnya lebih stabil dan lebih cepat dalam bahasa ECMAScript (ActionScript 1-3, dan JavaScript)
cwallenpoole
Atau, lewati iterasi sama sekali;)
Peter Bailey
Fungsi yang lebih sederhana? Mungkin tidak. Yang tidak diulang? Itu mungkin ... meskipun algoritme tidak sepenuhnya sepele.
coderjoe
1
Wow, hampir semua komentar di atas salah. Solusi @ profitehlolz lebih sederhana dan cocok untuk inlining (tidak perlu fungsi). Sementara itu for.vs. whilekinerja tidak cukup berbeda untuk menjadi menarik: jsperf.com/fors-vs-while/34
broofa
12

Terlambat ke pesta di sini, tetapi saya sering menggunakan konstruk ini untuk melakukan ad-hoc padding dengan nilai tertentu n , yang dikenal sebagai positif, desimal:

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

Dimana offset 10 ^^ digit.

Misalnya Padding hingga 5 digit, di mana n = 123:

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

Versi hexidecimal dari ini sedikit lebih bertele-tele:

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

Catatan 1: Saya suka solusi @ profitehlolz juga, yang merupakan versi string ini, menggunakan fitur indeks negatif slice () yang bagus.

broofa
sumber
12

Saya benar-benar tidak tahu mengapa, tetapi tidak ada yang melakukannya dengan cara yang paling jelas. Ini implementasi saya.

Fungsi:

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

Prototipe:

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

Sangat mudah, saya tidak bisa melihat bagaimana ini bisa lebih sederhana. Untuk beberapa alasan, saya sudah sering melihat SO, orang-orang hanya berusaha menghindari 'untuk' dan 'sambil' mengulangi dengan cara apa pun. Menggunakan regex mungkin akan membutuhkan biaya lebih banyak siklus untuk padding 8 digit sepele seperti itu.

Vitim.us
sumber
11

Saya menggunakan snipet ini untuk mendapatkan representasi 5 digit

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

Kekuatan Matematika!

x = integer ke pad
y = jumlah nol untuk pad

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

Saya tidak melihat ada yang menunjukkan fakta bahwa ketika Anda menggunakan String.prototype.substr () dengan angka negatif itu dihitung dari kanan.

Solusi satu liner untuk pertanyaan OP, representasi 6 digit dari nomor 5, adalah:

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

Generalisasi kita akan mendapatkan:

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

Stephen Quan
sumber
8

Setelah, lama, lama menguji 15 fungsi / metode berbeda yang ditemukan dalam jawaban pertanyaan ini, saya sekarang tahu mana yang terbaik (yang paling fleksibel dan tercepat).

Saya mengambil 15 fungsi / metode dari jawaban pertanyaan ini dan membuat skrip untuk mengukur waktu yang diperlukan untuk menjalankan 100 pembalut. Setiap pad akan pad nomor 9dengan 2000nol. Ini mungkin tampak berlebihan, dan memang begitu, tetapi memberi Anda ide bagus tentang penskalaan fungsi.

Kode yang saya gunakan dapat ditemukan di sini: https://gist.github.com/NextToNothing/6325915

Jangan ragu untuk memodifikasi dan menguji kode sendiri.

Untuk mendapatkan metode yang paling fleksibel, Anda harus menggunakan loop. Ini karena dengan jumlah yang sangat besar orang lain cenderung gagal, sedangkan, ini akan berhasil.

Jadi, loop mana yang digunakan? Nah, itu akan menjadi satu whilelingkaran. Sebuah forloop masih cepat, tetapi whileloop hanya sedikit lebih cepat (beberapa ms) - dan bersih.

Jawaban seperti itu oleh Wilco, Aleksandar Toplekatau Vitim.usakan melakukan pekerjaan dengan sempurna.

Secara pribadi, saya mencoba pendekatan yang berbeda. Saya mencoba menggunakan fungsi rekursif untuk mengisi string / angka. Itu bekerja lebih baik daripada metode bergabung dengan array tetapi, masih, tidak bekerja secepat loop for.

Fungsi saya adalah:

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

Anda dapat menggunakan fungsi saya dengan, atau tanpa, mengatur variabel padding. Jadi seperti ini:

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

Secara pribadi, setelah pengujian saya, saya akan menggunakan metode dengan loop sementara, seperti Aleksandar ToplekatauVitim.us . Namun, saya akan memodifikasinya sedikit sehingga Anda dapat mengatur string padding.

Jadi, saya akan menggunakan kode ini:

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'

Anda juga dapat menggunakannya sebagai fungsi prototipe, dengan menggunakan kode ini:

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'
Jack B
sumber
Saya memasukkan ini ke dalam jsfiddle untuk mempercepat pengujian yang lain, menambahkan versi kode Anda: jsfiddle.net/kevinmicke/vnvghw7y/2 Versi Anda selalu sangat kompetitif, dan terkadang paling cepat. Terima kasih atas pengujian yang cukup lengkap.
kevinmicke
8

Parameter pertama adalah bilangan real, parameter kedua adalah bilangan bulat positif yang menentukan jumlah minimum digit di sebelah kiri titik desimal dan parameter ketiga adalah bilangan bulat positif opsional yang menentukan angka jika digit di sebelah kanan titik desimal.

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
}

begitu

           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'
Jack Allan
sumber
8

Jangan menemukan kembali roda, gunakan string garis bawah :

jsFiddle

var numToPad = '5';

alert(_.str.pad(numToPad, 6, '0')); // yields: '000005'
Benny Bottema
sumber
8

Ini adalah solusi ES6.

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

Lewis
sumber
Jelas solusi yang paling elegan saya hanya akan memodifikasinya untuk menghindari konversi 2 string: const numStr = String(num)danreturn '0'.repeat(len - numStr.length) + numStr;
ngryman
8

Di semua browser modern yang dapat Anda gunakan

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

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

Lifehack
sumber
5

Bukannya pertanyaan ini membutuhkan lebih banyak jawaban, tetapi saya pikir saya akan menambahkan versi sederhana ini.

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

Seni
sumber
1
Lebih baik:var zfill = _.partialRight(_.padStart, '0');
Droog
3
Beberapa orang mungkin akan memprotes "Saya tidak ingin menggunakan lodash" tetapi ini bukan argumen yang valid lagi karena Anda hanya dapat menginstal fungsi ini:, npm install --save lodash.padleftlalu import padLeft from 'lodash.padleft'hilangkan_.
Andy
5

Cara terbaru untuk melakukan ini jauh lebih sederhana:

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

output: "02"

MrE
sumber
(8).toLocaleString(undefined, {minimumIntegerDigits: 5})kembali "00.008"untuk saya, berdasarkan lokal saya.
le_m
5

Hanya solusi lain, tapi saya pikir ini lebih mudah dibaca.

function zeroFill(text, size)
{
  while (text.length < size){
  	text = "0" + text;
  }
  
  return text;
}

Arthur
sumber
Sama seperti yang lainnya?
Fabio mengatakan Reinstate Monica
4

Yang ini kurang asli, tetapi mungkin yang tercepat ...

zeroPad = function (num, count) {
    var pad = (num + '').length - count;
    while(--pad > -1) {
        num = '0' + num;
    }
    return num;
};
Jonathan Neal
sumber
saya pikir Anda ingin melakukannya pad = count - (num + '').length. angka negatif tidak ditangani dengan baik, tetapi selain itu, itu tidak buruk. +1
nickf
3

Solusi saya

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

Pemakaian

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

var b = 567.25;
b.PadLeft(20, '2'); // 22222222222222567.25
Aleksandar Toplek
sumber
3

Mengapa tidak menggunakan rekursi?

function padZero(s, n) {
    s = s.toString(); // in case someone passes a number
    return s.length >= n ? s : padZero('0' + s, n);
}
lex82
sumber
padZero (223, 3) gagal dengan '0223'
Serginho
Yah, saya berasumsi bahwa fungsi ini disebut dengan string sebagai parameter pertama. Namun, saya memperbaikinya.
lex82
2

Beberapa monkeypatching juga berfungsi

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"
Rodrigo
sumber
1
-1 monkeypatching toplevel namespacing di javascript adalah praktik yang buruk.
Jeremy Wall
2
Benar untuk objek dan objek Array, tetapi String tidak buruk
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

... dll.

Bersulang

Pecah-pecah
sumber
Saya pikir itu harus lebih seperti: var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;jika Anda memperbaikinya saya akan menghapus suara saya.
drewish
@rewish Terima kasih telah mengetahui hal itu, saya setuju dengan hasil edit Anda (kecuali untuk hardcod yang 0bergabung dengan char :) - Jawaban diperbarui.
Madbreaks
Saya pikir akan lebih baik untuk menyimpan string ke dalam variabel sementara. Saya melakukan benchmarking di sini: jsperf.com/padding-with-memoization juga mendapat tolok ukur untuk penggunaan yang baru di "Array baru" hasil untuk yang baru ada di semua tempat tetapi penghafalan sepertinya cara untuk pergi.
drewish
2

Solusi paling sederhana dan paling mudah yang akan Anda temukan.

function zerofill(number,length) {
    var output = number.toString();
    while(output.length < length) {
      output = '0' + output;
    }
    return output;
}
d4nyll
sumber