• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

js kropka w liczbie dla czytelności i odwracanie wyrazu --> nie wiem jak dokończyć oraz proszę o wytłumaczenie

Object Storage Arubacloud
+2 głosów
224 wizyt
pytanie zadane 8 lipca 2021 w JavaScript przez Doge Gaduła (3,370 p.)

Witam, chciałbym zrobić tak, aby po osiągnięciu minimum 1000 w zmiennej coins, w zmiennej coins_readable zrobiło się 1.000, po osiągnięciu 1000000 zrobiło się 1.000.000 - po prostu aby dało się to czytać. Stworzyłem własny kod:

function to_readable()
{
    var coins_string;
    coins_string = coins.toString();
//[1]
    for(i=0;i<coins_string.length;i++)
    {
        if(i == 0 || i%3 != 0)
        {
            coins_readable += coins_string.substr(i, 1);
        }
        else
        {
            coins_readable += ".";
            coins_readable += coins_string.substr(i, 1);
        }
    }
//[2]
    document.getElementById("coins").innerHTML = '<span id="coin" class="coin">'+coins_readable+' coins</span>';
    coins_readable = "";
}

ale niestety przy liczbie takiej jak 1000 nie działa on poprawnie, ponieważ wyświetla 100.0

Jaki jest na to sposób?

myślałem coś o tym, aby dodać w [1] odwrócenie napisu, a później w [2] również odwrócenie napisu, ale niestety to nie działa.

Mam również prośbę - czy mógłby mi ktoś wytłumaczyć, o co chodzi w kodzie

coins_string.split("").reverse().join("");

odwracającym napis oraz czy są na to prostsze sposoby?

3 odpowiedzi

+3 głosów
odpowiedź 8 lipca 2021 przez rafal.budzis Szeryf (85,260 p.)
wybrane 9 lipca 2021 przez Doge
 
Najlepsza
Nie starałbym się sklejać wszystkiego w trakcie. Ja bym zrobił w pętli while pobieranie 3 ostatnich liter aż string nie bedzie pusty, a następnie połączył taką tablice funkcją join ;) Czyli zrobił bym sbie taki etap pośredni ;)

wejście "10000"
w trakcie : ["10", "000"]
koniec "10.000"

Ale nie wiem czy chcesz to kontynuować bo istnieje funkcja toLocaleString :

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString

;)
+2 głosów
odpowiedź 8 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

A może użyć metody replace na RegExp?

'12345678'.split('').reverse().join('').replace(/(?:\d{3})/g, (match, offset, input) => {
    if (offset === input.length || offset + match.length === input.length) {
        return match;
    }

    return `${match}.`;
}).split('').reverse().join('');

// "12.345.678"

Mam również prośbę - czy mógłby mi ktoś wytłumaczyć, o co chodzi w kodzie

Chodzi o odwrócenie stringa. Metoda split dzieli go na pojedyncze znaki w formie tablicy, reverse odwraca tablicę, a join łączy tablicę z powrotem w łańcuch po pojedynczych znakach. Nie wiem czy są prostsze rozwiązania - może pętla. Ale ten jest chyba najkrótszym zapisem.

2
komentarz 9 lipca 2021 przez niezalogowany

Ale ten jest chyba najkrótszym zapisem.

No i starego wyjadacza code-golfów wywołał

x.split('').reverse().join('')
;[...x].reverse``.join``

 

komentarz 9 lipca 2021 przez Doge Gaduła (3,370 p.)
@ScriptyChris a czy mógłbym prosić o wytłumaczenie tego kodu krok po kroku? Ponieważ praktycznie nic tutaj nie rozumiem
1
komentarz 9 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

Część z odwracaniem stringa już wyjaśniłem.

Jeśli chodzi o sam RegEx i metodę replace:

  • /(?:\d{3})/g szuka par liczb występujących trzykrotnie
  • if (offset === input.length || offset + match.length === input.length)
    sprawdza czy indeks (offset) znalezionej pary jest równy długości całej liczby (łańcucha) lub czy indeks + długość znalezionej pary (a pary są 3 znakowe) jest równy długości całego łańcucha
  • w takim przypadku zwraca tą parę
  • w przeciwnym razie zwraca parę z kropką na końcu
+1 głos
odpowiedź 11 lipca 2021 przez VBService Ekspert (252,740 p.)
edycja 11 lipca 2021 przez VBService

Udało Mi się skrócić funkcję  wink

[...[...x].reverse().join``.match(/.{1,3}/g).join`.`].reverse().join``;

 

Przykład użycia

String.prototype.setDots = (function() {
  return [...[...this].reverse().join``.match(/.{1,3}/g).join`.`].reverse().join``;
})

let x = 0, y = '';
for (let i=0; i<10; ++i) {
  x = Math.floor(Math.random() * (10 - 1) + 1);
  y = [...(y + (x).toString())].reverse().join``;
  console.log(y, y.setDots());
}

 

 

można też podać co ile znaków ma być wstawiony wybrany znak (domyślnie jest co 3 wstawiana kropka)

String.prototype.setChar = (function(x=3, y='.') {
  return [...[...this].reverse().join``.match(new RegExp(`.{1,${x}}`, 'g')).join(y)].reverse().join``;
})

 

Przykład użycia

String.prototype.setChar = (function(x=3, y='.') {
  return [...[...this].reverse().join``.match(new RegExp(`.{1,${x}}`, 'g')).join(y)].reverse().join``;
})

let x = 0, y = '';
for (let i=0; i<10; ++i) {
  x = Math.floor(Math.random() * (10 - 1) + 1);
  y = [...(y + (x).toString())].reverse().join``;
  console.log(y, y.setChar(), y.setChar(1,'|'), y.setChar(2,'+'));
}

 

Podobne pytania

0 głosów
3 odpowiedzi 300 wizyt
pytanie zadane 25 listopada 2017 w PHP przez pawelwch Użytkownik (880 p.)
0 głosów
1 odpowiedź 144 wizyt

92,555 zapytań

141,402 odpowiedzi

319,543 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...