Jaki jest zalecany sposób zerowania wartości w JavaScript? Wyobrażam sobie, że mógłbym zbudować niestandardową funkcję, aby wstawiać zera do wartości zapisanej na maszynie, ale zastanawiam się, czy istnieje bardziej bezpośredni sposób na zrobienie tego?
Uwaga: Przez „zerowane” mam na myśli w znaczeniu tego słowa w bazie danych (gdzie 6-cyfrowa zerowa reprezentacja liczby 5 to „000005”).
javascript
zerofill
Wilco
źródło
źródło
npm install sprintf-js
i wymagaj go w pliku, którego potrzebujesz:sprintf('%0d6', 5);
function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;}
... zakładając, żen
nie jest negatywnywhile
Aby uzyskać dostęp , musisz przekonwertować n na String przedn.length
mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Odpowiedzi:
Wystarczy prosta funkcja
możesz upiec to w bibliotece, jeśli chcesz zachować przestrzeń nazw lub cokolwiek innego. Podobnie jak w przypadku rozszerzenia jQuery .
źródło
Prosta droga. Możesz dodać mnożenie ciągów dla padu i przekształcić go w funkcję.
Jako funkcja,
źródło
paddy (888, 2)
plony,88
a nie888
zgodnie z wymaganiami. Ta odpowiedź nie obsługuje również liczb ujemnych.Nie mogę uwierzyć we wszystkie złożone odpowiedzi tutaj ... Po prostu użyj tego:
źródło
Ostatnio musiałem coś takiego wymyślić. Uznałem, że musi istnieć sposób, aby to zrobić bez użycia pętli.
Właśnie to wymyśliłem.
Następnie użyj go, podając klawisze numeryczne do zera:
Jeśli liczba jest większa niż dopełnienie, liczba rozszerzy się poza dopełnienie:
Dziesiętne też są w porządku!
Jeśli nie masz nic przeciwko zanieczyszczeniu globalnej przestrzeni nazw, możesz dodać ją bezpośrednio do Number:
A jeśli wolisz, aby ułamki dziesiętne zajmowały miejsce w wypełnieniu:
Twoje zdrowie!
XDR zaproponował wariację logarytmiczną, która wydaje się działać lepiej.
OSTRZEŻENIE : Ta funkcja nie działa, jeśli liczba równa się zero (np. Zeroopad (0, 2))
Mówiąc o wydajności, tomsmeding porównał 3 najlepsze odpowiedzi ( 4 z odmianą dziennika ). Zgadnij, który z nich znacznie przewyższał pozostałe dwa? :)
źródło
numZeros
parametru, ponieważ wprowadza on w błąd. To nie jest liczba zer, które chcesz dodać, to minimalna długość, jaką powinna być liczba. Lepsza nazwa tonumLength
lub nawetlength
.num
może wynosić zero ...Oto, czego użyłem do wpisania liczby do 7 znaków.
Takie podejście prawdopodobnie wystarczy dla większości ludzi.
Edycja: jeśli chcesz uczynić go bardziej ogólnym, możesz to zrobić:
Edycja 2: Zauważ, że od ES2017 możesz używać
String.prototype.padStart
:źródło
number = 123456789
, na przykład z kodem powyżej.new String
. Możesz po prostu użyć literałów łańcuchowych.(new Array(padding + 1).join("0")
można zastąpić"0".repeat(padding)
Współczesne przeglądarki obsługują teraz
padStart
, możesz po prostu teraz:Przykład:
źródło
Niestety istnieje wiele niepotrzebnych, skomplikowanych sugestii dotyczących tego problemu, zwykle polegających na napisaniu własnej funkcji do wykonywania operacji matematycznych lub łańcuchowych lub wywołaniu narzędzia innej firmy. Istnieje jednak standardowy sposób na wykonanie tego w podstawowej bibliotece JavaScript za pomocą tylko jednego wiersza kodu. Warto zawinąć ten jeden wiersz kodu w funkcję, aby uniknąć konieczności określania parametrów, których nigdy nie chcesz zmieniać, takich jak lokalna nazwa lub styl.
Spowoduje to wygenerowanie wartości „005” dla tekstu. Możesz także użyć funkcji toLocaleString parametru Number, aby wstawić zera po prawej stronie przecinka dziesiętnego.
Spowoduje to wygenerowanie wartości „5,00” dla tekstu. Zmień useGrouping na true, aby używać separatorów przecinków dla tysięcy.
Należy pamiętać, że stosując
toLocaleString()
sięlocales
ioptions
argumentów jest znormalizowany oddzielnie w ECMA-402 , a nie w ECMAScript. Na dzień dzisiejszy niektóre przeglądarki implementują tylko podstawową obsługę , tzn.toLocaleString()
Mogą ignorować wszelkie argumenty.Kompletny przykład
źródło
Jeśli z góry wiadomo, że liczba wypełnienia nie przekracza określonej wartości, istnieje inny sposób, aby to zrobić bez pętli:
Przypadki testowe tutaj: http://jsfiddle.net/jfriend00/N87mZ/
źródło
-88
powinien"-00088"
na przykład ustąpić .zeroFill(-88, 5)
powinno dać,-00088
czy-0088
? Myślę, że zależy to od tego, czy chcesz, abywidth
argumentem była cała szerokość liczby, czy tylko liczba cyfr (nie licząc znaku ujemnego). Implementator może łatwo zmienić zachowanie, tak aby nie zawierało znaku ujemnego, po prostu usuwając--width
wiersz kodu.Szybki i brudny sposób:
Dla x = 5 i count = 6 będziesz mieć y = "000005"
źródło
y="0005"
z powyższym,y = (new Array(count + 1 - x.toString().length)).join('0') + x;
y="000005"
('0000'+n).slice(-4)
Oto szybka funkcja, którą wymyśliłem, aby wykonać tę pracę. Jeśli ktoś ma prostsze podejście, nie krępuj się nim podzielić!
źródło
for
.vs.while
wydajność nie jest na tyle inna, aby była interesująca: jsperf.com/fors-vs-while/34Późno na imprezę tutaj, ale często używam tego konstruktu do wypełniania ad-hoc pewnej wartości
n
, znanej jako dodatnia, dziesiętna:Gdzie
offset
jest 10 ^ ^ cyfr.Np. Dopełnienie do 5 cyfr, gdzie n = 123:
Szesnastkowa wersja tego jest nieco bardziej szczegółowa:
Uwaga 1: Podoba mi się również rozwiązanie @ profitehlolz, które jest wersją łańcuchową, wykorzystując ciekawą funkcję indeksu ujemnego slice ().
źródło
Naprawdę nie wiem dlaczego, ale nikt nie zrobił tego w najbardziej oczywisty sposób. Oto moja implementacja.
Funkcjonować:
Prototyp:
Bardzo prosto, nie widzę żadnego sposobu, w jaki może to być prostsze. Z jakiegoś powodu wydaje się, że wiele razy tutaj na SO, ludzie po prostu starają się za wszelką cenę unikać pętli „for” i „while”. Korzystanie z wyrażenia regularnego będzie prawdopodobnie kosztować znacznie więcej cykli w przypadku tak trywialnego 8-cyfrowego wypełnienia.
źródło
Używam tego fragmentu kodu, aby uzyskać reprezentację 5 cyfr
źródło
ECMAScript 2017: użyj padStart lub padEnd
Więcej informacji:
źródło
Moc matematyki!
x = liczba całkowita do wypełnienia
y = liczba zer do wypełnienia
źródło
Nie widziałem, żeby ktokolwiek zwrócił uwagę na fakt, że gdy używasz String.prototype.substr () z liczbą ujemną, to liczy się od prawej.
Jedno liniowe rozwiązanie pytania PO, 6-cyfrowa zerowa reprezentacja liczby 5, to:
Uogólniając otrzymamy:
źródło
Po długim, długim czasie testowania 15 różnych funkcji / metod znalezionych w odpowiedziach na pytania, teraz wiem, która jest najlepsza (najbardziej wszechstronna i najszybsza).
Z odpowiedzi na to pytanie wziąłem 15 funkcji / metod i stworzyłem skrypt do pomiaru czasu potrzebnego na wykonanie 100 padów. Każdy pad będzie pad numer
9
z2000
zerami. Może się to wydawać przesadne i jest, ale daje dobre wyobrażenie o skalowaniu funkcji.Kod, którego użyłem, można znaleźć tutaj: https://gist.github.com/NextToNothing/6325915
Możesz samodzielnie zmodyfikować i przetestować kod.
Aby uzyskać najbardziej uniwersalną metodę, musisz użyć pętli. Wynika to z faktu, że przy bardzo dużej liczbie inni mogą zawieść, a to się powiedzie.
Której pętli użyć? To byłaby
while
pętla.for
Pętla nadal jest szybki, alewhile
pętla jest tylko nieznacznie szybciej (kilka ms) - i czystsze.Odpowiedzi takie jak te
Wilco
,Aleksandar Toplek
lubVitim.us
zrobią to doskonale.Osobiście próbowałem innego podejścia. Próbowałem użyć funkcji rekurencyjnej do uzupełnienia ciągu / liczby. Działa lepiej niż metody łączące tablicę, ale nadal nie działa tak szybko jak pętla for.
Moja funkcja to:
Możesz użyć mojej funkcji z ustawieniem zmiennej dopełniania lub bez niej. Więc tak:
Osobiście po moich testach użyłbym metody z pętlą while, jak
Aleksandar Toplek
lubVitim.us
. Jednak zmodyfikowałbym go nieco, abyś mógł ustawić łańcuch dopełniania.Więc użyłbym tego kodu:
Możesz również użyć go jako funkcji prototypowej, używając tego kodu:
źródło
Pierwszy parametr to dowolna liczba rzeczywista, drugi parametr jest liczbą całkowitą dodatnią określającą minimalną liczbę cyfr po lewej stronie przecinka dziesiętnego, a trzeci parametr jest opcjonalną liczbą całkowitą dodatnią określającą liczbę, jeśli cyfry znajdują się po prawej stronie przecinka dziesiętnego.
więc
źródło
Nie wymyślaj koła ponownie, użyj łańcucha podkreślenia :
jsFiddle
źródło
To jest rozwiązanie ES6.
źródło
const numStr = String(num)
ireturn '0'.repeat(len - numStr.length) + numStr;
We wszystkich nowoczesnych przeglądarkach możesz używać
Oto odniesienie do MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
źródło
Nie chodzi o to, że to pytanie wymaga więcej odpowiedzi, ale pomyślałem, że dodam jego prostą wersję.
_.padLeft(number, 6, '0')
źródło
var zfill = _.partialRight(_.padStart, '0');
npm install --save lodash.padleft
następnieimport padLeft from 'lodash.padleft'
pomiń_.
Najnowszy sposób na zrobienie tego jest znacznie prostszy:
output: "02"
źródło
(8).toLocaleString(undefined, {minimumIntegerDigits: 5})
zwraca"00.008"
za mnie, w oparciu o moje ustawienia regionalne.To kolejne rozwiązanie, ale myślę, że jest bardziej czytelne.
źródło
Ten jest mniej rodzimy, ale może być najszybszy ...
źródło
pad = count - (num + '').length
. liczby ujemne nie są dobrze obsługiwane, ale poza tym nie jest źle. +1Moje rozwiązanie
Stosowanie
źródło
Dlaczego nie skorzystać z rekurencji?
źródło
Niektóre monkeypatching również działają
źródło
pad(5, 0, 6)
=000005
pad('10', 0, 2)
=10 // don't pad if not necessary
pad('S', 'O', 2)
=SO
...itp.
Twoje zdrowie
źródło
var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;
jeśli to naprawisz, usunę mój głos negatywny.0
dołączenia char :) - Odpowiedź zaktualizowana.Najprostsze , najbardziej prosta rozwiązanie znajdziesz.
źródło