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").
Jawaban:
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 .
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
Saya tidak percaya semua jawaban rumit di sini ... Gunakan saja ini:
var zerofilled = ('0000'+n).slice(-4);
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? :)
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")
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"
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 locales
dan
options
argumen 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
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/
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"
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;
}
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.
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.
Saya menggunakan snipet ini untuk mendapatkan representasi 5 digit
(value+100000).toString().slice(-5) // "00123" with value=123
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('.','');
}
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));
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 9
dengan 2000
nol. 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
while
lingkaran. Sebuah for
loop masih cepat, tetapi while
loop hanya sedikit lebih cepat (beberapa ms) - dan bersih.
Jawaban seperti itu oleh Wilco
, Aleksandar Toplek
atau Vitim.us
akan 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 Toplek
atauVitim.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'
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'
Jangan menemukan kembali roda, gunakan
string garis bawah :
jsFiddle
var numToPad = '5';
alert(_.str.pad(numToPad, 6, '0')); // yields: '000005'
Ini adalah solusi ES6.
function pad(num, len) {
return '0'.repeat(len - num.toString().length) + num;
}
alert(pad(1234,6));
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
Bukannya pertanyaan ini membutuhkan lebih banyak jawaban, tetapi saya pikir saya akan menambahkan versi sederhana ini.
_.padLeft(number, 6, '0')
Cara terbaru untuk melakukan ini jauh lebih sederhana:
var number = 2
number.toLocaleString(undefined, {minimumIntegerDigits:2})
output: "02"
Hanya solusi lain, tapi saya
pikir ini lebih mudah dibaca.
function zeroFill(text, size)
{
while (text.length < size){
text = "0" + text;
}
return text;
}
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;
};
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
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);
}
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"
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
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;
}