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

Zamiana liczby cyfrą na liczbę słowami

VPS Starter Arubacloud
0 głosów
483 wizyt
pytanie zadane 9 września 2019 w PHP przez Kamil Czech Dyskutant (7,700 p.)

Witam,

chcę zrobić stronę na której użytkownik może wpisać liczbę cyfrą a strona zamieni na liczbę napisaną słowami, lecz nie wiem jak się za to zabrać.

Coś podobnego jak ta strona

http://kwotaslownie.pl/

Dziękuję za pomoc

1 odpowiedź

+2 głosów
odpowiedź 9 września 2019 przez tangarr Mędrzec (155,140 p.)
wybrane 12 września 2019 przez Kamil Czech
 
Najlepsza
Najpierw rozważ jak to zrobić dla liczb z przedziałów 0-9 i 10-19, następnie obsłuż przedział 20-99.
Później używając analogicznych metod będziesz mógł obsłużyć przedział 100-999.
W tym momencie powinieneś zdać sobie sprawę jak dodać obsługę tysięcy, milionów, miliardów itd.
Najlepiej rozpisz sobie początek na kartce i szukaj zależności. Zauważ że np dla liczby 1234 piszesz tysiąc coś, a dla liczby 5234 piszesz pięć tysięcy coś. Ta zależność będzie się powtarzać dla kolejnych liczebników głównych.
komentarz 11 września 2019 przez Kamil Czech Dyskutant (7,700 p.)
A mógłbyś dać jakiś przykład kodu ???
komentarz 11 września 2019 przez tangarr Mędrzec (155,140 p.)

Nie znam PHP. Ale, że trochę mi się nudziło przygotowałem pseudokod
 

funkcja napis_1_19(liczba) {
    if (liczba < 1 OR liczba > 19) rzuć_wyjątek("zły argument")
    if (liczba == 1) return "jeden"
    if (liczba == 2) return "dwa"
    ...
    if (liczba == 19) return "dziewiętnaście"
}

funkcja napis_dziesiatki(liczba) {
    if (liczba < 2 OR liczba > 9) rzuć_wyjątek("zły argument")
    if (liczba == 2) return "dwadzieścia"
    ...
    if (liczba == 9) return "dziewięćdziesiąt"
}

funkcja napis_setki(liczba) {
    // analogicznie
}

funkcja napis_1_99(liczba) {
    if (liczba <= 19) return napis_1_19(liczba)
    if (liczba > 99) rzuć_wyjątek("zły argument")
    dziesiatki = liczba / 10
    jednosci = liczba modulo 10

    wynik = napis_dziesiatki(dziesiatki)
    if (jednosci == 0) return wynik
    wynik = wynik + " " + napis_1_19(jednosci)
}

funkcja napis_1_999(liczba) {
    // analogicznie jak napis_1_99
    // obliczasz setki i reszte z przedzialu 0 - 99
}

funkcja odmien_liczebnik_tysiac(liczba) {
    if (liczba == 1) return "tysiąc"
    jednosci = liczba modulo 10
    if (jednosci == 2 OR jednosci == 3 OR jednosci == 4) return "tysiące"
    return "tysięcy"
}

funkcja napis_tysiace(liczba) {
    if (liczba < 1 OR liczba > 999999) rzuć_wyjątek("zły argument")
    tysiace = liczba / 1000
    reszta = liczba modulo 1000

    wynik = napis_1_999(tysiace) + " " + odmien_liczebnik(tysiace)
    if (reszta == 0) return wynik
    wynik = wynik + " " + napis_1_999(reszta)
    return wynik
}

funkcja napis_miliony(liczba) {
    // analogicznie
}

funkcja konwertuj_liczbe_na_napis(liczba) {
    if (liczba == 0) return "zero"
    if (liczba < 0) return "minus " + napis_miliony(-liczba)
    return napis_miliony(liczba)
}

 

komentarz 12 września 2019 przez Kamil Czech Dyskutant (7,700 p.)

Coś tu nie działa:

Parse error: syntax error, unexpected 'napis_1_19' (T_STRING) in C:\xampp\htdocs\liczbaslowa\przeliczik.php on line 4

komentarz 12 września 2019 przez Chess Szeryf (76,710 p.)

Najlepiej byłoby to chyba na switchu napisać, a nie na ifie.

<?php
$number = 10;

switch($number) {
  case 0:
    echo 'zero';
    break;
  case 1:
    echo 'jeden';
    break;
  case 2:
    echo 'dwa';
    break;
    // (...) And so on.
}
?>

@Kamil Czech, bo ma nie działać. Przecież wyraźnie napisał, że to pseudokod. Musisz na podstawie tego kodu napisać swój.

komentarz 12 września 2019 przez Kamil Czech Dyskutant (7,700 p.)

Dzięki działa wink

komentarz 13 września 2019 przez Kamil Czech Dyskutant (7,700 p.)

@Chess, A co z większymi liczbami, potrzebuję zrobić od 0.01 do 30000 więc wychodzi ponad 300000 możliwości ???

komentarz 13 września 2019 przez Chess Szeryf (76,710 p.)
edycja 13 września 2019 przez Chess

Raczej nie. Musisz napisać odpowiedni algorytm, poszukaj zależności. Tutaj masz jak, to może wyglądać od strony algorytmu. Nie musisz bazować na gotowcach. Rozpisz sobie na kartce krok po kroku jak zamieniać poszczególne liczby na wyrazy i tyle. W tym źródle jest opisane, że pierwsza forma z liczby równa, powyżej 1000 jest chyba tak odmieniana jak poniżej.

1000 - jeden tysiąc, 2000 - dwa tysiące, 3000 - trzy tysiące, 4000 - cztery tysiące, 5000 - pięć tysięcy, itd.

komentarz 15 września 2019 przez Kamil Czech Dyskutant (7,700 p.)
A jak zrobić przedziały ?

np. od 1 do 1.99 ma pisać Jeden

od 2 do 2.99 ma pisać dwa

i tak dalej
1
komentarz 15 września 2019 przez Chess Szeryf (76,710 p.)

Masz wymyślić algorytm do tego. Część przed przecinkiem i po możesz wyłuskać w ten sposób.

<?php

$n = 1.99;

// sscanf($n, "%d")[0] => 1
// sscanf($n, "%f")[0] => 0.99


switch(sscanf($n, "%d")[0]) {
  case 1:
    echo 'one';
    break;
  case 2:
    echo 'two'; 
    break;
}

?>

Może zamiast sscanf lepiej byłoby użyć jakiś truncate, ale jak do tej pory nie znalazłem w PHP takowej instrukcji.

Podobne pytania

0 głosów
2 odpowiedzi 214 wizyt
pytanie zadane 30 listopada 2023 w C i C++ przez maxkolanko1998 Gaduła (3,230 p.)
0 głosów
4 odpowiedzi 1,911 wizyt
pytanie zadane 9 października 2018 w JavaScript przez masterfiletable2 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 309 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)

93,018 zapytań

141,984 odpowiedzi

321,282 komentarzy

62,364 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...