584 Stimmen

Wie kann ich einen Wert mit führenden Nullen auffüllen?

Was ist der empfohlene Weg, um einen Wert in JavaScript mit Nullen zu füllen? Ich kann mir vorstellen, dass ich eine benutzerdefinierte Funktion zum Auffüllen von Nullen auf einen eingegebenen Wert bauen könnte, aber ich frage mich, ob es einen direkteren Weg gibt, dies zu tun?

Anmerkung: Mit "zerofilled" meine ich es im Sinne des Wortes in der Datenbank (wo eine 6-stellige zerofilled Darstellung der Zahl 5 "000005" wäre).

0voto

Adaline Simonian Punkte 4316

Mit ES6 ist dies ziemlich trivial:

function pad (num, length, countSign = true) {
  num = num.toString()
  let negative = num.startsWith('-')
  let numLength = negative && !countSign ? num.length - 1 : num.length
  if (numLength >= length) {
    return num
  } else if (negative) {
    return '-' + '0'.repeat(length - numLength) + num.substr(1)
  } else {
    return '0'.repeat(length - numLength) + num
  }
}

pad(42, 4)          === '0042'
pad(12345, 4)       === '12345'
pad(-123, 4)        === '-100'
pad(-123, 4, false) === '-0100'

0voto

MrMesees Punkte 1318

Nur zu Ihrer Information: Die Syntax ist klarer und lesbarer, IMHO.

"use strict";
String.prototype.pad = function( len, c, left ) {
    var s = '',
        c = ( c || ' ' ),
        len = Math.max( len, 0 ) - this.length,
        left = ( left || false );
    while( s.length < len ) { s += c };
    return ( left ? ( s + this ) : ( this + s ) );
}
Number.prototype.pad = function( len, c, left ) {
    return String( this ).pad( len, c, left );
}
Number.prototype.lZpad = function( len ) {
    return this.pad( len, '0', true );
}

Dies führt auch zu weniger visuellen und Lesbarkeitsstörungen der Ergebnisse als einige der anderen Lösungen, die "0" als ein Zeichen erzwingen; die Beantwortung meiner Fragen, was ich tun, wenn ich andere Zeichen auffüllen möchte, oder in die andere Richtung (rechte Auffüllung), während einfach zu tippen und klar zu lesen bleibt. Ich bin mir ziemlich sicher, dass es auch das DRY'est Beispiel ist, mit dem wenigsten Code für die eigentliche führende Null-Padding-Funktion Körper (wie die anderen abhängigen Funktionen sind weitgehend irrelevant für die Frage).

Der Code ist über gist von diesem github-Benutzer (ursprüngliche Quelle des Codes) zum Kommentieren verfügbar https://gist.github.com/Lewiscowles1986/86ed44f428a376eaa67f

Eine Anmerkung zu Konsolen- und Skripttests, numerische Literale scheinen Klammern oder eine Variable zu benötigen, um Methoden aufzurufen, so dass 2.pad(...) einen Fehler verursacht, während (2).pad(0,'#') keinen Fehler verursacht. Dies ist für alle Zahlen gleich, wie es scheint

0voto

Boluc Papuccuoglu Punkte 2273

Dies ist ein Angular-Provider, den ich geschrieben habe, der die Antwort von @profitehlolz nutzt, aber Memoisierung einsetzt, so dass häufig verwendete Pad-Länge-Pad-Zeichen-Kombinationen nicht unnötig die Array-Build-Join aufrufen:

angular.module('stringUtilities', [])
    .service('stringFunctions', [function() {
        this.padMemo={ };
        this.padLeft=function(inputString,padSize,padCharacter) {

            var memoKey=padSize+""+padCharacter;

            if(!this.padMemo[memoKey]) {

                this.padMemo[memoKey]= new Array(1 + padSize).join(padCharacter);
            }

           var pad=this.padMemo[memoKey];
           return (pad + inputString).slice(-pad.length);
       };
}]);

0voto

JohnK Punkte 6057

Mit ein wenig Mathematik können Sie eine einzeilige Funktion ermitteln:

function zeroFill( number, width ) {
  return Array(width - parseInt(Math.log(number)/Math.LN10) ).join('0') + number;
}

Das setzt voraus, dass number ist eine ganze Zahl, die nicht größer ist als width . Wenn die aufrufende Routine diese Garantie nicht geben kann, muss die Funktion einige Prüfungen durchführen:

function zeroFill( number, width ) {
    var n = width - parseInt(Math.log(number)/Math.LN10);
    return (n < 0) ? '' + number : Array(n).join('0') + number;
}

0voto

David Griffin Punkte 13021
exports.pad = (num, length) => "0".repeat(length - num.toString().length) + num;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X