formatering - Fyll ett nummer med ledande nollor i JavaScript
I JavaScript behöver jag ha utfyllnad.
Till exempel, om jag har siffran 9, kommer det att vara "0009". Om jag har flera, säg 10, kommer det att vara "0010". Lägg märke till hur det alltid kommer att innehålla fyra siffror.
Ett sätt att göra detta skulle vara att subtrahera numret minus 4 för att få antalet nollor jag behöver lägga till.
Finns det ett smidigare sätt att göra detta?
Svar #1
ES2017 Uppdatering
Du kan använda den inbyggda String.prototype.padStart()
n = 9;
String(n).padStart(4, '0'); // '0009'
n = 10;
String(n).padStart(4, '0'); // '0010'
Inte mycket 'slick' som händer hittills:
function pad(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}
När du initialiserar en array med ett nummer skapas en array med length satt till det värdet så att arrayen verkar innehålla så många undefined-element. Även om vissa metoder för Array-instans hoppar över array-element utan värden, gör .join() inte det, åtminstone inte helt; den behandlar dem som om deras värde är den tomma strängen. Därför får du en kopia av nolltecknet (eller vad "z" än är) mellan varje array-element; det är därför det finns ett + 1 där.
Exempel på användning:
pad(10, 4); // 0010
pad(9, 4); // 0009
pad(123, 4); // 0123
pad(10, 4, '-'); // --10
Svar #2
function padToFour(number) {
if (number<=9999) { number = ("000"+number).slice(-4); }
return number;
}
Något sådant?
Bonus obegriplig-men-snyggare enradig ES6-version:
let padToFour = number => number <= 9999 ? `000${number}`.slice(-4) : number;
ES6-ismer:
letär en block-scopead variabel (i motsats tillvar’s funktionella scope)=>är en pilfunktion som, bland annat, ersätterfunctionoch föregås av sina parametrar- Om en pilfunktion tar ett enda parameter kan du utelämna parenteserna (därav
number =>) - Om en arrow-funktions kropp har en enda rad som börjar med
return, kan du utelämna klamrarna ochreturn-nyckelordet och helt enkelt använda uttrycket - För att få funktionskroppen till en enda rad, fuskte jag och använde ett ternärt uttryck
Svar #3
Försök :
String.prototype.lpad = function(padString, length) {
var str = this;
while (str.length < length)
str = padString + str;
return str;
}
Testa nu:
var str = "5";
alert(str.lpad("0", 4)); //result "0005"
var str = "10"; // note this is string type
alert(str.lpad("0", 4)); //result "0010"
DEMO
I ECMAScript 2017 har vi nya metoder padStart och padEnd som har följande syntax.
"string".padStart(targetLength [,padString]):
Så nu kan vi använda
const str = "5";
str.padStart(4, "0"); // "0005"
Svar #4
Roligt, jag var tvungen att göra det här nyligen.
function padDigits(number, digits) {
return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
}
Använd som:
padDigits(9, 4); // "0009"
padDigits(10, 4); // "0010"
padDigits(15000, 4); // "15000"
Inte vacker, men effektiv.
Svar #5
Du sa att du hade ett nummer-
String.prototype.padZero= function(len, c){
var s= '', c= c || '0', len= (len || 2)-this.length;
while(s.length<len) s+= c;
return s+this;
}
Number.prototype.padZero= function(len, c){
return String(this).padZero(len,c);
}
Svar #6
Du skulle kunna göra något liknande detta:
function pad ( num, size ) {
return ( Math.pow( 10, size ) + ~~num ).toString().substring( 1 );
}
Redigera: Detta var bara en grundläggande idé för en funktion, men för att lägga till stöd för större siffror (såväl som ogiltig inmatning), skulle detta förmodligen vara bättre:
function pad ( num, size ) {
if (num.toString().length >= size) return num;
return ( Math.pow( 10, size ) + Math.floor(num) ).toString().substring( 1 );
}
Detta gör två saker:
- Om numret är större än den angivna storleken kommer det helt enkelt att returnera numret.
- Att använda
Math.floor(num)istället för~~numkommer att stödja större tal.
