Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Cena słownie po angielsku
propage
post
Post #1





Grupa: Zarejestrowani
Postów: 330
Pomógł: 0
Dołączył: 25.01.2008

Ostrzeżenie: (0%)
-----


Szukam funkcji która bedzie cene, na tekst po angielsku czyli np "25" na twenty five
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Wicepsik
post
Post #2





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


Kilka funkcji http://funkcje.net/view/2/1628/index.html
Wystarczy przetłumaczyć wszystko na angielskie słowa.
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Na angielski jest jeszcze prościej niż na polski. Nie ma bowiem choćby osiemset, siedemset ale jest siedem setek (IMG:style_emoticons/default/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" (IMG:style_emoticons/default/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" (IMG:style_emoticons/default/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...

Ten post edytował thek 20.11.2009, 00:44:26
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 28.09.2025 - 14:10