2010-06-08 4 views
333

Possible Duplicate:
How can I create a Zerofilled value using JavaScript?Wie Ausgang ganze Zahlen mit führenden Nullen in JavaScript

Ich kann rund um x Menge an Dezimalstellen mit Math.round aber ist es eine Möglichkeit, der dezimal links abzuzurunden? zum Beispiel 5 wird 05, wenn ich 2 Plätze vorschlage

+8

Nicht roundi ng, das ist String Formatierung. – Lazarus

+0

das ist nicht rund .. das ist Formatierung .. –

+78

Ich habe gefunden [http://www.codigomanso.com/de/2010/07/simple-javascript-formatting-zero-padding/] was ich Vermutung ist viel einfacher: '(" 00 "+ h) .slice (-3);' –

Antwort

523

NOTE: Potentially outdated. ECMAScript 2017 includes String.prototype.padStart

Sie fragen nach Nullauffüllung? Nicht wirklich rund. Sie müssen es in eine Zeichenfolge konvertieren, da Zahlen mit führenden Nullen keinen Sinn ergeben. So etwas wie dies ...

function pad(num, size) { 
    var s = num+""; 
    while (s.length < size) s = "0" + s; 
    return s; 
} 

Oder wenn Sie wissen, dass Sie nie mehr verwenden würde als X Anzahl der Nullen dies könnte besser sein. Dies setzt voraus, dass Sie nie mehr als 10 Ziffern wünschen.

function pad(num, size) { 
    var s = "000000000" + num; 
    return s.substr(s.length-size); 
} 

Wenn Sie sich für negative Zahlen interessieren, müssen Sie das "-" entfernen und neu einlesen.

+92

Zweite Funktion; kürzer: '' 'function pad (num, size) { return ('000000000' + num) .substr (-size); } '' ' – Blaise

+5

^Negative Werte werden in vielen IE-Versionen nicht funktionieren. – InfinitiesLoop

+5

Ah, anscheinend arbeitet slice() mit negativen Werten im IE :) http://StackOverflow.com/Questions/2243824/what-is-the-difference-between-string-slice-and-string-substring-in- Javascript – InfinitiesLoop

125

Ein anderer Ansatz:

function zeroPad(num, places) { 
    var zero = places - num.toString().length + 1; 
    return Array(+(zero > 0 && zero)).join("0") + num; 
} 

zeroPad(5, 2); // "05" 
zeroPad(5, 4); // "0005" 
zeroPad(5, 6); // "000005" 
zeroPad(1234, 2); // "1234" :) 
+1

+1 - Ich schlug vor, die Array-Methode zu verbinden, bis InfinitiesLoop seine Antwort gepostet hat und ich meine Meinung geändert habe :-) –

+1

Sie berücksichtigen negative Array-Größen nicht;) zB 'zeroPad (1234, 2)' -> 'RangeError: Ungültige Array-Länge' –

+3

Nach diesem Benchmark ist diese Methode 5 mal langsamer als die akzeptierte Lösung: https://gist.github.com/4382935 – andrewrk

3

Just for fun (ich hatte einige Zeit zu töten) eine komplexere Implementierung, die die Null-String-Caches:

pad.zeros = new Array(5).join('0'); 
function pad(num, len) { 
    var str = String(num), 
     diff = len - str.length; 
    if(diff <= 0) return str; 
    if(diff > pad.zeros.length) 
     pad.zeros = new Array(diff + 1).join('0'); 
    return pad.zeros.substr(0, diff) + str; 
} 

Wenn die Polsterung Zahl groß ist und die Funktion wird oft genug aufgerufen, es übertrifft tatsächlich die anderen Methoden ...

60

Von https://gist.github.com/1180489

function pad(a,b){return(1e15+a+"").slice(-b)} 

mit Kommentaren:

function pad(
    a, // the number to convert 
    b // number of resulting characters 
){ 
    return (
    1e15 + a + // combine with large number 
    "" // convert to string 
).slice(-b) // cut leading "1" 
} 
+43

Das ist gut, aber es hat einen fatalen Fehler. Zum Beispiel, Pad (1234, 3) === "234" '! Das ist natürlich inakzeptabel. –

+1

Es ist auch kaputt, wenn Sie mehr als 15 Polsterung wollen. Elegant, aber ziemlich unflexibel. –

+0

@ dave1010 Ich bekam ein schlechtes Ergebnis 'pad (1234)' ergibt '" 10000000000"'. mit dem Parameter 'pad (1234,20)' ergibt '" 10000000000"' Danke @Brock Adams – JamesThomasMoon1979

6
function zfill(num, len) {return (Array(len).join("0") + num).slice(-len);} 
+1

Wenn Sie Code eingeben, wählen Sie ihn aus und klicken Sie auf die Schaltfläche '{}', so dass er als solcher formatiert wird. – Shef

+8

zfill (1234, 3) === "234" –

+0

Funktion zFill (n, l) {return (l> n.toString(). Länge)? ((Array (l) .join ('0') + n) .slice (-l)): n;} –

161

Sie könnten das Number Objekt erweitern:

Number.prototype.pad = function(size) { 
    var s = String(this); 
    while (s.length < (size || 2)) {s = "0" + s;} 
    return s; 
} 

Beispiele:

(9).pad(); //returns "09" 

(7).pad(3); //returns "007" 
+1

Ich denke, das ist genau das, was ich brauche. Das Argument 'Größe' bezieht sich auf die Anzahl der FINAL-Zeichen und nicht auf die Gesamtzahl der hinzuzufügenden Nullen, richtig? –

+0

Ja, es tut, es überprüft die Gesamtlänge und vergleicht das. –

+0

Ja, es hängt davon ab, wo Sie es verwenden. Es ist nicht von Natur aus schlechte Sache, aber wenn in einem Raum mit viel Beteiligung von Dritten verwendet, möglicherweise ein Risiko mit Überschreiben der Funktionalität. –