Potrzebuję funkcji JavaScript, która może przyjąć wartość i dopełnić ją do określonej długości (potrzebuję spacji, ale wszystko by zrobiło). Znalazłem to:
Kod:
String.prototype.pad = function(l, s, t){
return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
+ 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
+ this + s.substr(0, l - t) : this;
};
Przykład:
<script type="text/javascript">
//<![CDATA[
var s = "Jonas";
document.write(
'<h2>S = '.bold(), s, "</h2>",
'S.pad(20, "[]", 0) = '.bold(), s.pad(20, "[]", 0), "<br />",
'S.pad(20, "[====]", 1) = '.bold(), s.pad(20, "[====]", 1), "<br />",
'S.pad(20, "~", 2) = '.bold(), s.pad(20, "~", 2)
);
//]]>
</script>
Ale nie mam pojęcia, co do cholery robi i wydaje mi się, że to nie działa.
javascript
string
Anthony Potts
źródło
źródło
Odpowiedzi:
Znalazłem to rozwiązanie tutaj i jest to dla mnie znacznie prostsze:
I tutaj zrobiłem rozszerzenie do obiektu string:
Przykład użycia:
Zwróci czas w formacie „15:30”
źródło
String
bibliotek JSString.padStart()
iString.padEnd()
do wypełniania lewej / prawej strony.Szybsza metoda
Jeśli robisz to wielokrotnie, na przykład aby uzupełnić wartości w tablicy, a wydajność jest czynnikiem, poniższe podejście może dać ci prawie 100- krotną przewagę szybkości ( jsPerf ) w porównaniu z innymi rozwiązaniami, które są obecnie omawiane w Internecie . Podstawową ideą jest to, że udostępniasz funkcję padu w pełni wypełnionym pustym ciągiem, który ma być używany jako bufor. Funkcja padu po prostu dołącza się do łańcucha, który ma zostać dodany do tego wstępnie wypełnionego łańcucha (jeden konkat łańcucha), a następnie kroi lub przycina wynik do pożądanej długości.
Na przykład, aby wyzerować pad do liczby o długości 10 cyfr,
Aby wstawić ciąg znaków spacją, aby cały ciąg miał 255 znaków,
Test wydajności
Zobacz test jsPerf tutaj .
Jest to również szybsze niż ES6
string.repeat
o 2x, jak pokazuje poprawiony JsPerf tutajźródło
string.repeat
metoda ES6 . Więc jeśli robisz dużo wyściółki sznurka, zdecydowanie spróbuj tego.http://www.webtoolkit.info/javascript_pad.html
Jest o wiele bardziej czytelny.
źródło
pad("hello", 20) = "hello "
Oto rekurencyjne podejście do tego.
Przykład...
źródło
String.prototype.padStart()
iString.prototype.padEnd()
są obecnie propozycjami TC39: patrz github.com/tc39/proposal-string-pad-start-end (dostępny tylko w Firefoksie od kwietnia 2016 r.; dostępny jest polifill ).źródło
myString.padStart(padLength [, padString])
imyString.padEnd(padLength [, padString])
ECMAScript 2017 dodaje metodę padStart do prototypu String. Ta metoda wypełni łańcuch ze spacjami do określonej długości. Ta metoda pobiera również opcjonalny ciąg znaków, który będzie używany zamiast spacji do wypełnienia.
Dodano również metodę padEnd, która działa w ten sam sposób.
W celu uzyskania zgodności z przeglądarką (i przydatnego wypełnienia) zobacz ten link .
źródło
Za pomocą metody ECMAScript 6 String # repeat funkcja pad jest tak prosta, jak:
String#repeat
jest obecnie obsługiwany tylko w Firefoksie i Chrome. dla innych wdrożeń można rozważyć następującą prostą polifill:źródło
Za pomocą metody ECMAScript 6 Ciąg # powtórz i Funkcje strzałek funkcja pad jest tak prosta, jak:
jsfiddle
edycja: sugestia z komentarzy:
w ten sposób nie wyrzuca błędu, gdy
s.length
jest większy niżn
edit2: sugestia z komentarzy:
w ten sposób możesz użyć funkcji zarówno dla łańcuchów, jak i dla łańcuchów.
źródło
s.length
jest większe niżn
rzuci. Zasugeruj:let leftPad = (s, c, n) => n - s.length > 0 ? c.repeat(n - s.length) + s : s;
leftPad(12, ' ', 5)
. Chociaż wiem ściśle, że może być w porządku, prawdopodobnie jest to jeden z najczęstszych przypadków użycia (liczby dopełniające). Możefunction leftPad(s, c, n) { s = s.toString(); return s.length > len ? s : c.repeat(n - s.length) + s; }
. Używaniefunction
oznacza, że leftPad może znajdować się na dole pliku. W przeciwnym razie powinieneś prawdopodobnieconst
nie używaćvar
anilet
.len
?len
powinny byćn
Kluczową sztuczką w obu tych rozwiązaniach jest utworzenie
array
instancji o danym rozmiarze (o jeden więcej niż pożądana długość), a następnie natychmiastowe wywołaniejoin()
metody w celu utworzeniastring
.join()
Sposób przepuszcza wyściółkastring
(miejsca prawdopodobnie). Ponieważ polearray
jest puste, puste komórki będą renderowane jako pustestrings
podczas procesu łączeniaarray
w jeden wynikstring
i pozostanie tylko wypełnienie. To naprawdę fajna technika.źródło
pad z wartościami domyślnymi
Zauważyłem, że najczęściej potrzebuję padLeft do przeliczania czasu / uzupełniania liczb
więc napisałem tę funkcję
Ta prosta funkcja obsługuje liczbę lub ciąg znaków jako dane wejściowe
domyślny pad to 2 znaki
domyślny znak to 0
więc mogę po prostu pisać
jeśli dodam drugi argument (szerokość padu)
trzeci parametr (pad char)
EDYCJA @BananaAcid, jeśli przekażesz niezdefiniowaną wartość lub ciąg o długości 0, otrzymasz
0undefined
: więc:jak proponowano
ale można to również osiągnąć w krótszy sposób.
współpracuje również z:
A jeśli chcesz mieć możliwość wypełniania na dwa sposoby:
które można zapisać w krótszy sposób bez użycia wycinka.
teraz, jeśli spróbujesz uzupełnić słowo „averylongword” 2, to nie mój problem.
Powiedział, że dam ci wskazówkę.
Przez większość czasu, jeśli padasz, robisz to dla tej samej wartości N razy.
Użycie dowolnego rodzaju funkcji w pętli spowalnia pętlę !!!
Więc jeśli chcesz po prostu zostawić kilka liczb na długiej liście, nie używaj funkcji do robienia tej prostej rzeczy.
użyj czegoś takiego:
jeśli nie wiesz, w jaki sposób maksymalny rozmiar wypełnienia oparty na liczbach w tablicy.
źródło
return (new Array((b||1)+1).join(c||0)+(a||'')).slice(-(b||2))
. I jak zawsze: wy, nie kopiujcie tylko kodu, którego nie rozumiecie.W ES8 dostępne są dwie opcje wypełnienia.
Możesz to sprawdzić w dokumentacji.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
źródło
Podejście do pomysłów Samuela, tutaj w górę. I pamiętaj stary skrypt SQL, próbowałem z tym:
Działa we wszystkich przypadkach, jakie mogłem sobie wyobrazić:
źródło
łańcuch wypełniający został dodany w nowej wersji javascript.
str.padStart(targetLength [, padString])
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/padStart
Jeśli chcesz mieć własną funkcję, sprawdź ten przykład:
źródło
Oto prosta funkcja, której używam.
Na przykład:
źródło
Krótka droga:
Przykład:
return: „001234”
źródło
String.prototype.padStart()
powinno być łatwiejsze.es7 to teraz tylko szkice i propozycje, ale jeśli chcesz śledzić zgodność ze specyfikacją, funkcje pada wymagają:
Z mojej biblioteki polyfill, ale zastosuj swoją własną należytą staranność w odniesieniu do rozszerzeń prototypów.
źródło
Oto prosta odpowiedź w zasadzie w jednym wierszu kodu.
Upewnij się, że liczba znaków w twoim wypełnieniu, tutaj zer, jest co najmniej taka, jak zamierzona minimalna długość. Tak naprawdę, umieszczenie go w jednej linii, aby uzyskać wynik „00035” w tym przypadku to:
źródło
Manipulacje tablicami są bardzo powolne w porównaniu do prostego ciągu łańcuchowego. Oczywiście benchmark dla twojego przypadku użycia.
źródło
Wariant odpowiedzi @Daniel LaFavers .
Na przykład:
źródło
Jest rok 2014 i sugeruję funkcję dopełniania napisów Javascript. Ha!
Gołe kości: prawa podkładka ze spacjami
Fantazyjne: podkładka z opcjami
Zastosowanie (fantazyjne):
źródło
Jeśli nie masz nic przeciwko dołączeniu biblioteki narzędziowej, biblioteka Lodash ma funkcje _.pad, _.padLeft i _.padRight .
źródło
Myślę, że lepiej unikać rekurencji, ponieważ jest to kosztowne.
źródło
Oto funkcja JavaScript, która dodaje określoną liczbę wypełnień z niestandardowym symble. funkcja przyjmuje trzy parametry.
źródło
A potem możesz zrobić:
źródło
Jeśli chcesz tylko bardzo prostą, wyszywaną wkładką do wypełnienia, po prostu ułóż ciąg pożądanego charakteru wypełnienia o pożądanej maksymalnej długości wypełnienia, a następnie podciągnij go do długości tego, co chcesz wypełnić.
Przykład: wypełnienie magazynu ciągów
e
spacjami o długości do 25 znaków.Wynik:
"hello "
Jeśli chcesz zrobić to samo z liczbą jako wejściem, po prostu zadzwoń
.toString()
na nią wcześniej.źródło
Array(n).join(c)
do skonfigurowania długości i charakteru dopełnienia, npArray(26).join(' ')
.jeszcze jedno podejście z kombinacją kilku rozwiązań
źródło
Znajomy zapytał o użycie funkcji JavaScript do padnięcia w lewo. To stało się trochę staraniem między niektórymi z nas na czacie, aby kodować golfa. To był wynik:
Zapewnia, że wartość do uzupełnienia jest łańcuchem, a następnie, jeśli nie jest ona długością całkowitej pożądanej długości, wstawi ją raz, a następnie powtórzy. Oto jak to wygląda z bardziej logiczną nazwą i strukturą
Przykład, którego używaliśmy, to dopilnowanie, aby liczby były
0
uzupełnione po lewej stronie, aby uzyskać maksymalną długość 6. Oto przykładowy zestaw:źródło
Trochę późno, ale pomyślałem, że i tak mogę się podzielić. Przydało mi się dodanie prototypowego rozszerzenia do Object. W ten sposób mogę wprowadzać liczby i ciągi znaków, w lewo lub w prawo. Mam moduł z podobnymi narzędziami, które włączam do swoich skryptów.
~~~~~~~~~~~~ jsAddOns.js ~~~~~~~~~~~~
źródło
str = pad + str;
), Ponieważ dane będą każdorazowo ponownie przydzielane. Dołącz zawsze na końcu!str += pad;
). Znacznie szybsze jest dołączanie łańcucha dopełniania do siebie i wyodrębnianie pierwszych znaków X (parser może to zrobić skutecznie, jeśli wyodrębnisz go z pierwszego znaku). Jest to wzrost wykładniczy, co oznacza, że tymczasowo marnuje trochę pamięci (nie powinieneś tego robić z bardzo dużymi tekstami).źródło
Oto moje zdanie
Nie jestem pewien co do jego wydajności, ale uważam ją za bardziej czytelną niż inne opcje, które widziałem tutaj ...
źródło