Was ist die empfohlene Methode, um einen Wert in JavaScript auf Null zu setzen? Ich stelle mir vor, ich könnte eine benutzerdefinierte Funktion erstellen, um Nullen auf einen typisierten Wert aufzufüllen, aber ich frage mich, ob es einen direkteren Weg gibt, dies zu tun?
Hinweis: Mit "nullgefüllt" meine ich es im Datenbank-Sinne des Wortes (wobei eine 6-stellige nullgefüllte Darstellung der Zahl 5 "000005" wäre).
javascript
zerofill
Wilco
quelle
quelle
npm install sprintf-js
und fordern Sie Knoten-Apps in dersprintf('%0d6', 5);
function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;}
... vorausgesetztn
nicht negativwhile
in einen String konvertieren, um darauf zugreifen zu könnenn.length
mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Antworten:
Eine einfache Funktion ist alles was Sie brauchen
Sie können dies in eine Bibliothek backen, wenn Sie den Namespace oder was auch immer beibehalten möchten. Wie bei jQuery's Extend .
quelle
Einfacher Weg. Sie können eine Zeichenfolgenmultiplikation für das Pad hinzufügen und es in eine Funktion umwandeln.
Als eine Funktion,
quelle
paddy (888, 2)
Ausbeuten88
und nicht888
wie erforderlich. Diese Antwort behandelt auch keine negativen Zahlen.Ich kann all die komplexen Antworten hier nicht glauben ... Verwenden Sie einfach Folgendes:
quelle
Ich musste mir in letzter Zeit tatsächlich so etwas einfallen lassen. Ich dachte, es müsste einen Weg geben, dies ohne Schleifen zu tun.
Das habe ich mir ausgedacht.
Verwenden Sie es dann einfach und geben Sie eine Zahl für das Nullfeld an:
Wenn die Zahl größer als die Auffüllung ist, wird die Zahl über die Auffüllung hinaus erweitert:
Dezimalstellen sind auch in Ordnung!
Wenn es Ihnen nichts ausmacht, den globalen Namespace zu verschmutzen, können Sie ihn direkt zu Number hinzufügen:
Und wenn Sie lieber Dezimalstellen haben möchten, nehmen Sie Platz in der Polsterung ein:
Prost!
XDR hat eine logarithmische Variation entwickelt , die anscheinend eine bessere Leistung erbringt.
WARNUNG : Diese Funktion schlägt fehl, wenn num gleich Null ist (z. B. Zeropad (0, 2)).
Apropos Leistung: Tomsmeding verglich die drei besten Antworten ( 4 mit der logarithmischen Variation ). Ratet mal, welches die beiden anderen deutlich übertroffen hat? :) :)
quelle
numZeros
Parameters, da er irreführend ist. Es ist nicht die Anzahl der Nullen, die Sie hinzufügen möchten, sondern die Mindestlänge, die die Anzahl haben sollte. Ein besserer Name wärenumLength
oder sogarlength
.num
sie Null sein kann ...Hier ist, was ich verwendet habe, um eine Zahl mit bis zu 7 Zeichen aufzufüllen.
Dieser Ansatz wird wahrscheinlich für die meisten Menschen ausreichen.
Bearbeiten: Wenn Sie es allgemeiner machen möchten, können Sie dies tun:
Bearbeiten 2: Beachten Sie, dass Sie seit ES2017 Folgendes verwenden können
String.prototype.padStart
:quelle
number = 123456789
Zum Beispiel mit dem obigen Code.new String
. Sie können einfach String-Literale verwenden.(new Array(padding + 1).join("0")
kann ersetzt werden durch"0".repeat(padding)
Moderne Browser unterstützen jetzt
padStart
, Sie können jetzt einfach tun:Beispiel:
quelle
Leider gibt es viele unnötig komplizierte Vorschläge für dieses Problem, die normalerweise das Schreiben einer eigenen Funktion zur Durchführung von Mathematik- oder Zeichenfolgenmanipulationen oder das Aufrufen eines Dienstprogramms eines Drittanbieters umfassen. Es gibt jedoch eine Standardmethode in der Basis-JavaScript-Bibliothek mit nur einer Codezeile. Es kann sinnvoll sein, diese eine Codezeile in eine Funktion einzubinden, um zu vermeiden, dass Sie Parameter angeben müssen, die Sie niemals ändern möchten, wie z. B. den lokalen Namen oder Stil.
Dies erzeugt den Wert "005" für Text. Sie können auch die toLocaleString-Funktion von Number verwenden, um Nullen auf der rechten Seite des Dezimalpunkts aufzufüllen.
Dies ergibt den Wert "5.00" für Text. Ändern Sie useGrouping in true, um Komma-Trennzeichen für Tausende zu verwenden.
Beachten Sie, dass die Verwendung
toLocaleString()
mitlocales
undoptions
Argumenten in ECMA-402 separat standardisiert ist , nicht in ECMAScript. Ab heute implementieren einige Browser nur die grundlegende Unterstützung , dhtoLocaleString()
sie ignorieren möglicherweise alle Argumente.Vollständiges Beispiel
quelle
Wenn im Voraus bekannt ist, dass die Füllnummer einen bestimmten Wert nicht überschreitet, gibt es eine andere Möglichkeit, dies ohne Schleifen zu tun:
Testfälle hier: http://jsfiddle.net/jfriend00/N87mZ/
quelle
-88
sollte"-00088"
zum Beispiel nachgeben .zeroFill(-88, 5)
produzieren sollte-00088
oder-0088
? Ich denke, es hängt davon ab, ob daswidth
Argument die gesamte Breite der Zahl oder nur die Anzahl der Ziffern (ohne das negative Vorzeichen) haben soll. Ein Implementierer kann das Verhalten einfach so ändern, dass das negative Vorzeichen nicht berücksichtigt wird, indem nur die--width
Codezeile entfernt wird.Der schnelle und schmutzige Weg:
Für x = 5 und count = 6 haben Sie y = "000005"
quelle
y="0005"
mit dem oben genannten bekommen,y = (new Array(count + 1 - x.toString().length)).join('0') + x;
was mir gegeben haty="000005"
('0000'+n).slice(-4)
Hier ist eine kurze Funktion, die ich mir ausgedacht habe, um die Arbeit zu erledigen. Wenn jemand einen einfacheren Ansatz hat, können Sie ihn gerne teilen!
quelle
for
.vs.while
Leistung ist nicht unterschiedlich genug, um interessant zu sein: jsperf.com/fors-vs-while/34Spät zur Party hier, aber ich benutze dieses Konstrukt oft, um Ad-hoc-Auffüllungen mit einem Wert
n
durchzuführen, der als positive Dezimalzahl bekannt ist:Wo
offset
ist 10 ^^ Ziffern.ZB Auffüllen auf 5 Stellen, wobei n = 123:
Die hexadezimale Version davon ist etwas ausführlicher:
Anmerkung 1: Ich mag auch die Lösung von @ profitehlolz, bei der es sich um die String-Version handelt, bei der die raffinierte Negativindex-Funktion von Slice () verwendet wird.
quelle
Ich weiß wirklich nicht warum, aber niemand hat es auf die offensichtlichste Weise getan. Hier ist meine Implementierung.
Funktion:
Prototyp:
Sehr einfach, ich kann nicht sehen, wie dies einfacher sein kann. Aus irgendeinem Grund habe ich hier auf SO oft den Eindruck, dass die Leute nur versuchen, "for" - und "while" -Schleifen um jeden Preis zu vermeiden. Die Verwendung von Regex kostet wahrscheinlich viel mehr Zyklen für eine so triviale 8-stellige Auffüllung.
quelle
Ich benutze dieses Snipet, um eine 5-stellige Darstellung zu erhalten
quelle
ECMAScript 2017: Verwenden Sie padStart oder padEnd
Mehr Info:
quelle
Die Kraft der Mathematik!
x = Ganzzahl zum Auffüllen
y = Anzahl der Nullen zum Auffüllen
quelle
Ich habe niemanden darauf hinweisen sehen, dass wenn Sie String.prototype.substr () mit einer negativen Zahl verwenden, dies von rechts zählt.
Eine einzeilige Lösung für die Frage des OP, eine 6-stellige nullgefüllte Darstellung der Zahl 5, lautet:
Verallgemeinernd werden wir bekommen:
quelle
Nach einer langen, langen Zeit des Testens von 15 verschiedenen Funktionen / Methoden, die in diesen Fragen gefunden wurden, weiß ich jetzt, welche die besten (die vielseitigsten und schnellsten) sind.
Ich habe 15 Funktionen / Methoden aus den Antworten auf diese Frage genommen und ein Skript erstellt, um die Zeit zu messen, die für die Ausführung von 100 Pads benötigt wird. Jedes Pad würde die Zahl
9
mit2000
Nullen auffüllen. Dies mag übertrieben erscheinen, ist es aber, aber es gibt Ihnen eine gute Vorstellung von der Skalierung der Funktionen.Den von mir verwendeten Code finden Sie hier: https://gist.github.com/NextToNothing/6325915
Sie können den Code jederzeit selbst ändern und testen.
Um die vielseitigste Methode zu erhalten, müssen Sie eine Schleife verwenden. Dies liegt daran, dass bei sehr großen Zahlen andere wahrscheinlich scheitern, während dies erfolgreich sein wird.
Also, welche Schleife soll verwendet werden? Nun, das wäre eine
while
Schleife. Einefor
Schleife ist immer noch schnell, aber einewhile
Schleife ist nur etwas schneller (ein paar ms) - und sauberer.Antworten wie die von
Wilco
,Aleksandar Toplek
oderVitim.us
den Job perfekt machen.Persönlich habe ich einen anderen Ansatz versucht. Ich habe versucht, eine rekursive Funktion zu verwenden, um die Zeichenfolge / Nummer aufzufüllen. Es funktionierte besser als Methoden, die einem Array beitreten, funktionierte aber immer noch nicht so schnell wie eine for-Schleife.
Meine Funktion ist:
Sie können meine Funktion mit oder ohne Einstellung der Füllvariablen verwenden. Also so:
Persönlich würde ich nach meinen Tests eine Methode mit einer while-Schleife verwenden, wie
Aleksandar Toplek
oderVitim.us
. Ich würde es jedoch leicht ändern, damit Sie die Füllzeichenfolge festlegen können.Also würde ich diesen Code verwenden:
Sie können es auch als Prototypfunktion verwenden, indem Sie diesen Code verwenden:
quelle
Der erste Parameter ist eine beliebige reelle Zahl, der zweite Parameter ist eine positive Ganzzahl, die die minimale Anzahl von Stellen links vom Dezimalpunkt angibt, und der dritte Parameter ist eine optionale positive Ganzzahl, die die Zahl angibt, wenn die Ziffern rechts vom Dezimalpunkt stehen.
damit
quelle
Das Rad nicht neu erfinden, Unterstrich verwenden :
jsFiddle
quelle
Dies ist die ES6-Lösung.
quelle
const numStr = String(num)
undreturn '0'.repeat(len - numStr.length) + numStr;
In allen modernen Browsern können Sie verwenden
Hier ist die MDN-Referenz https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
quelle
Nicht, dass diese Frage mehr Antworten benötigt, aber ich dachte, ich würde die einfache lodash-Version hinzufügen.
_.padLeft(number, 6, '0')
quelle
var zfill = _.partialRight(_.padStart, '0');
npm install --save lodash.padleft
, dannimport padLeft from 'lodash.padleft'
und lassen Sie das_.
Der neueste Weg, dies zu tun, ist viel einfacher:
output: "02"
quelle
(8).toLocaleString(undefined, {minimumIntegerDigits: 5})
kehrt"00.008"
für mich zurück, basierend auf meinem Gebietsschema.Nur eine andere Lösung, aber ich denke, es ist besser lesbar.
quelle
Dieser ist weniger einheimisch, kann aber der schnellste sein ...
quelle
pad = count - (num + '').length
. negative Zahlen werden nicht gut behandelt, aber ansonsten ist es nicht schlecht. +1Meine Lösung
Verwendungszweck
quelle
Warum nicht Rekursion verwenden?
quelle
Einige Monkeypatching funktioniert auch
quelle
pad(5, 0, 6)
=000005
pad('10', 0, 2)
=10 // don't pad if not necessary
pad('S', 'O', 2)
=SO
...usw.
Prost
quelle
var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;
Wenn Sie es reparieren, werde ich meine Abwahl entfernen.0
Join-Zeichens :) - Antwort aktualisiert.Die einfachste und einfachste Lösung, die Sie finden werden.
quelle