Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Cena słownie po angielsku
Forum PHP.pl > Forum > Gotowe rozwiązania > Szukam
propage
Szukam funkcji która bedzie cene, na tekst po angielsku czyli np "25" na twenty five
Wicepsik
Kilka funkcji http://funkcje.net/view/2/1628/index.html
Wystarczy przetłumaczyć wszystko na angielskie słowa.
thek
Na angielski jest jeszcze prościej niż na polski. Nie ma bowiem choćby osiemset, siedemset ale jest siedem setek smile.gif Jedynie przy kilkanaście trzeba mieć coś osobnego. A tak bierzesz liczbę i lecisz algorytmem
1. Dzielisz liczbę przez 10 do potęgi (3*dowolna_maksymalna) 3->miliardy, 2->miliony, 1->tysiące
2. Jeśli większe od 1000, podnosisz potęgę,
3. Jeśli mniejsze od 1 to obniżamy potęgę o 1 -> jeszcze raz sprawdzamy 3
4. Dzielisz część całkowitą z dzielenia przez 100. Sprawdzasz też czy cała ta liczba jest większa od 1 bo to determinuje czy dodasz na końcu rzędu końcówkę s, bo wtedy, przykładowo, nie million, ale millions
5. Jeśli większe od 0, to tyle masz setek, ale jeśli to 1 to nie dodajesz literki s na końcu setek
6. Reszta z dzielenia przez 100 sprawdzamy czy większe od 19
7. Jeśli tak, to dzielimy przez 10 i mamy liczbę dziesiątek a modulo z dzielenia przez dziesięć to liczba jedności
8. Jeśli nie, to wpisujemy słowo od 1 do 19 z tablicy i dodajemy oznaczenie potęgi
9. Reszta z dzielenia liczby przez daną potęgę to nasza nowa liczba.
10. Sprawdzamy czy mniejsza od 1. Jeśli tak to koniec
11. Jeśli nie -> wracamy do kroku 3

Przykład: 219.457
Potęga maks to 3:
liczba / 10^(3*3) = 219.457/1.000.000.000 < 1 -> obniżamy potęgę bo to nie miliardy
liczba / 10^(3*2) = 219.457/1.000.000 < 1 -> obniżamy potęgę bo to nie miliony
liczba / 10^(3*1) = 219.457/1.000, w końcu zakres większy od 1 i mniejszy od 1000
219.457/1.000 = 219,457, całkowita -> 219 (czyli dodamy końcówkę s bo większe niż 1)
219 / 100 = całkowite -> 2 (two hundreds)
219 modulo 100 = 19
19 wpada w zakres, czyli na sztywno dopisujemy (nineteen) i dopisujemy oznaczenie potęgi czyli "thousands"
Liczymy resztę z liczby dzielenia przez 1.000 i mamy 457
Powtarzamy to i otrzymujemy odpowiednio: four hundreds, fifty, seven

Dla Ciebie już pozostawiam jedynie banalny problem kiedy wstawia się pomiędzy wyrazy słówko "and" winksmiley.jpg

EDIT: Nie wyjaśniłem czemu mam 2 i 3 choć wzajemnie się wykluczają i robi się nadmiarowe pętle. To zabezpieczenie przed zbyt małym maksymalnym. Jeśli masz bowiem miliony a ustawisz na start maksymalnie tysiące, to masz problem. Ale jeśli startujesz od bilionów to możesz śmiało krok 2 odpuścić sobie. Taki algorytm pozwala ominąć "puste przestrzenie" jak choćby w 123.000.056 gdzie nie ma wcale partii "tysiące" smile.gif Od razu z milionów wskoczy do setek.

EDIT2: Bym zapomniał... W ten sposób potrzebne Ci tablice skracają się do:
potęgowych określeń: array([0]=> '', [1] => 'thousand', [2] => 'million', [3]=> 'billion');
określeń dziesiątek od 20 wzwyż: array([2]=> 'twenty', [3]=> 'thirty', [4] => 'forty',(...), [9] => 'ninty' );
liczb od 1 do 19: array([1]=>'one', [2] => 'two', (...), [19] => 'nineteen')
Reszta to dodawanie końcówki "s: i "and" w odpowiednich miejscach algorytmu...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.