Ich musste mir vor kurzem etwas Ähnliches einfallen lassen. Ich dachte mir, dass es einen Weg geben muss, es ohne Schleifen zu machen.
Das habe ich mir ausgedacht.
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;
}
Dann verwenden Sie es einfach als Zahlenkreuz:
> zeroPad(50,4);
"0050"
Wenn die Zahl größer ist als der Füllbereich, wird die Zahl über den Füllbereich hinaus erweitert:
> zeroPad(51234, 3);
"51234"
Dezimalzahlen sind auch in Ordnung!
> zeroPad(51.1234, 4);
"0051.1234"
Wenn es Ihnen nichts ausmacht, den globalen Namespace zu verschmutzen, können Sie ihn direkt zu Number hinzufügen:
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;
}
Und wenn Sie es vorziehen, dass Dezimalzahlen Platz in der Füllung einnehmen:
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;
}
Zum Wohl!
XDR kam mit eine logarithmische Veränderung die besser zu funktionieren scheint.
WARNUNG : Diese Funktion schlägt fehl, wenn num gleich Null ist (z. B. 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;
}
Apropos Leistung, tomsmeding die 3 besten Antworten verglichen ( 4 mit der logarithmischen Variation ). Raten Sie mal, welche hauptsächlich besser als die beiden anderen? :)