Na angielski jest jeszcze prościej niż na polski. Nie ma bowiem choćby osiemset, siedemset ale jest siedem setek

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 million
s5. 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 hundred
s)
219 modulo 100 = 19
19 wpada w zakres, czyli na sztywno dopisujemy (nineteen) i dopisujemy oznaczenie potęgi czyli "thousand
s"
Liczymy resztę z liczby dzielenia przez 1.000 i mamy 457
Powtarzamy to i otrzymujemy odpowiednio: four hundred
s, fifty, seven
Dla Ciebie już pozostawiam jedynie banalny problem kiedy wstawia się pomiędzy wyrazy słówko "and"

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"

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...