Formatowanie liczb (JavaScript)


(system) #1

Witam !

Mam taki problem.. nie jestem zbyt dobry z matematyki, a chciałbym stworzyć skrypt w JS, który formatowałby liczby jak w PHP funkcja number_format() .

Zrobiłem coś takiego, ale to nie jest zbyt oryginalny skrypt i w dodatku dość rozbudowane.. dużo niepotrzebnego kodu tutaj zapewne:

function formatLiczba(liczba, rozdzielnik) {

    liczba = new String(liczba);

    if (liczba.length < 4) {

        return liczba;

    }

     else if (liczba.length < 7) {

        liczbaK = liczba.slice(0, liczba.length-3);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-3, liczba.length);

        return liczbaK;

    }

     else if (liczba.length < 10) {

        liczbaK = liczba.slice(0, liczba.length-6);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-6, liczba.length-3);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-3, liczba.length);

        return liczbaK;

    }

     else if (liczba.length < 13) {

        liczbaK = liczba.slice(0, liczba.length-9);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-9, liczba.length-6);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-6, liczba.length-3);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-3, liczba.length);

        return liczbaK;

    }

     else if (liczba.length < 16) {

         liczbaK = liczba.slice(0, liczba.length-12);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-12, liczba.length-9);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-9, liczba.length-6);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-6, liczba.length-3);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-3, liczba.length);

        return liczbaK;

    }

     else if (liczba.length < 19) {

        liczbaK = liczba.slice(0, liczba.length-15);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-15, liczba.length-12);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-12, liczba.length-9);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-9, liczba.length-6);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-6, liczba.length-3);

        liczbaK += rozdzielnik;

        liczbaK += liczba.slice(liczba.length-3, liczba.length);

        return liczbaK;

    }

     else {

        return liczba;

    }

}

Przykład mojego skryptu: - przykładowy kod korzystający z powyższej funkcji:

document.write(formatLiczba(200000000, "."))
  • wynik zastosowanego powyżej przykładu:

    200.000.000

Tak więc, jak widać.. skrypt spełnia z reguły moje oczekiwania, jednak.. wiem, że idzie to napisać prościej i wygodniej. Po drugie stworzona przeze mnie funkcja ma ograniczenie do liczb z maksymalnie 18 liczb..

Pomoże ktoś? Z góry dziękuję.


(Airborn) #2

faktycznie musi istnieć prostsza metoda, ja bym kombinował z jakąś pętlą for, niestety chwilowo jestem zajęty, ale zobacz, może coś wymyślisz, jak nie, pokaż do czego doszedłeś i coś ewentualnie się wymyśli wspólnie za kilka godzin


(system) #3

Otóż.. ktoś mi już pomógł i stworzył takie coś:

function number_format(l,r){w='';while(a=~~(l/1e3)){w=r+((b=l%1e3)>9?(b>99?'':'0'):'00')+b+w;l=a}return l+w}

Funkcja ta działa poprawnie, jednak tylko na liczbach do 12 zer.


(adpawl) #4

A ja podsunę może bardziej rozbudowane rozwiązanie ...ale bez takiego ograniczenia i ze sporą możliwością konfiguracji ...np. z dostosowaniem do formatowania waluty :wink:


(mrbungle) #5

ja za to skróciłem do "wymaganego minimum":

co daje efekt:

4 888 888 999 995,457

4.888.888.999.995,457

chyba taki konkretnie efekt chciałeś osiągnąć? :>

PZDR


(adpawl) #6

Tylko że np. dla

daje

:roll:


(mrbungle) #7

jak się bawimy w przekraczenie wartości inta to nie dziwne... okej dla zabawy zrobie wersje drugĄ...