Jeśli musisz to zrobić dla dużej listy wartości, wydajność DecimalFormat jest co najmniej 3 razy lepsza niż String.format (). Jestem w trakcie dostrajania wydajności i uruchamianie dwóch w Visual VM pokazuje metodę String.format () sumującą czas CPU z szybkością około 3-4 razy większą niż DecimalFormat.format ().
@chiperortiz afaik przy użyciu powyższych narzędzi formatujących nie jest możliwe. W takim przypadku obliczam wymagane znaki wiodące (np. int prefixLength = requiredTotalLength - String.valueOf(numericValue).length), A następnie używam metody powtarzania łańcucha, aby utworzyć wymagany przedrostek. Istnieją różne sposoby powtarzania ciągów, ale nie ma natywnego języka Java, afaik: stackoverflow.com/questions/1235179/…
Tak, zamierzałem zasugerować DecimalFormat, ponieważ nie wiedziałem o String.format, ale potem zobaczyłem odpowiedź uzhina. String.format musi być nowy.
Jeśli wydajność jest ważna w twoim przypadku, możesz to zrobić samemu z mniejszym narzutem w porównaniu do String.formatfunkcji:
/**
* @param in The integer value
* @param fill The number of digits to fill
* @return The given value left padded with the given number of digits
*/publicstaticString lPadZero(int in,int fill){boolean negative =false;int value, len =0;if(in >=0){
value = in;}else{
negative =true;
value =- in;
in =- in;
len ++;}if(value ==0){
len =1;}else{for(; value !=0; len ++){
value /=10;}}StringBuilder sb =newStringBuilder();if(negative){
sb.append('-');}for(int i = fill; i > len; i--){
sb.append('0');}
sb.append(in);return sb.toString();}
Wydajność
publicstaticvoid main(String[] args){Random rdm;long start;// Using own function
rdm =newRandom(0);
start =System.nanoTime();for(int i =10000000; i !=0; i--){
lPadZero(rdm.nextInt(20000)-10000,4);}System.out.println("Own function: "+((System.nanoTime()- start)/1000000)+"ms");// Using String.format
rdm =newRandom(0);
start =System.nanoTime();for(int i =10000000; i !=0; i--){String.format("%04d", rdm.nextInt(20000)-10000);}System.out.println("String.format: "+((System.nanoTime()- start)/1000000)+"ms");}
Wstrząsający! To orzechy, które działają tak źle. Musiałem wyzerować pad i wyświetlić kolekcję niepodpisanych liczb wewnętrznych, które mogą zawierać od 1 do 3 cyfr. Musiał działać błyskawicznie. Użyłem tej prostej metody: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";działało to bardzo szybko (przepraszam, że tego nie czas!).
GuavaBiblioteka jest bardzo przydatna, ale także zawiera wiele funkcji, które związane Collections, Caches, Functional idioms, Concurrency,Strings , Primitives, Ranges, IO, Hashing, EventBus, etc
Powyższy przykładowy kod to tylko użycie, a nie przykładowy kod. Komentarz odzwierciedla to, potrzebujesz „String myPaddedString = Strings.padStart (...)”
Chociaż wiele z powyższych podejść jest dobrych, ale czasami musimy sformatować liczby całkowite oraz zmiennoprzecinkowe. Możemy tego użyć, szczególnie gdy potrzebujemy wstawić określoną liczbę zer po lewej i po prawej stronie liczb dziesiętnych.
Sprawdź mój kod, który będzie działał dla liczb całkowitych i ciągów.
Załóżmy, że naszym pierwszym numerem jest 2. I chcemy do tego dodać zera, aby długość końcowego łańcucha wynosiła 4. W tym celu możesz użyć następującego kodu
int number=2;int requiredLengthAfterPadding=4;String resultString=Integer.toString(number);int inputStringLengh=resultString.length();int diff=requiredLengthAfterPadding-inputStringLengh;if(inputStringLengh<requiredLengthAfterPadding){
resultString=newString(newchar[diff]).replace("\0","0")+number;}System.out.println(resultString);
@Isaac - Najpierw utworzyłem tablicę znaków, a używając tej tablicy znaków utworzyłem ciąg. Następnie zastąpiłem znak zerowy (która jest domyślną wartością typu char) na „0” (który jest char, którego potrzebujemy tutaj do wypełniania)
Słuszna uwaga. I myślę, że robi więcej, niż było wymagane, ponieważ obcina się na szerokość (co nie było wyraźnie wymagane, ale jest zwykle potrzebne). Szkoda, że Java (boleśnie powolny w porównaniu) String.format () nie obsługuje zmiennych o szerokości i wcale nie obsługuje precyzji dla specyfikatorów liczb całkowitych.
String paddedString = i <100? i <10?"00"+ i :"0"+ i :""+ i;
Spowoduje to dodanie ciągu do trzech znaków i łatwe dodanie części dla czterech lub pięciu. Wiem, że to nie jest idealne rozwiązanie w żaden sposób (zwłaszcza jeśli chcesz duży wyściełany sznurek), ale mi się podoba.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.