Skip to content

Instantly share code, notes, and snippets.

@spapas
Created December 14, 2020 07:52
Show Gist options
  • Save spapas/09189a0f2659d6506f049d1c84af2412 to your computer and use it in GitHub Desktop.
Save spapas/09189a0f2659d6506f049d1c84af2412 to your computer and use it in GitHub Desktop.
Greek numbers to words in python
import unittest
num2words = {
1: "ένα",
2: "δύο",
3: "τρία",
4: "τέσσερα",
5: "πέντε",
6: "έξι",
7: "επτά",
8: "οχτώ",
9: "εννέα",
10: "δέκα",
11: "έντεκα",
12: "δώδεκα",
13: "δεκατρία",
14: "δεκατέσσερα",
15: "δεκαπέντε",
16: "δεκαέξι",
17: "δεκαεπτά",
18: "δεκαοχτώ",
19: "δεκαεννέα",
20: "είκοσι",
30: "τριάντα",
40: "σαράντα",
50: "πενήντα",
60: "εξήντα",
70: "εβδομήντα",
80: "ογδόντα",
90: "ενενήντα",
100: "εκατόν",
200: "διακόσια",
300: "τριακόσια",
400: "τετρακόσια",
500: "πεντακόσια",
600: "εξακόσια",
700: "επτακόσια",
800: "οκτακόσια",
900: "εννιακόσια",
1000: "χίλια",
}
num2words_f = {
1: "μια",
2: "δύο",
3: "τρείς",
4: "τέσσερις",
5: "πέντε",
6: "έξι",
7: "επτά",
8: "οχτώ",
9: "εννέα",
10: "δέκα",
11: "έντεκα",
12: "δώδεκα",
13: "δεκατρείς",
14: "δεκατέσσερις",
15: "δεκαπέντε",
16: "δεκαέξι",
17: "δεκαεπτά",
18: "δεκαοχτώ",
19: "δεκαεννέα",
20: "είκοσι",
30: "τριάντα",
40: "σαράντα",
50: "πενήντα",
60: "εξήντα",
70: "εβδομήντα",
80: "ογδόντα",
90: "ενενήντα",
100: "εκατό",
200: "διακόσιες",
300: "τριακόσιες",
400: "τετρακόσιες",
500: "πεντακόσιες",
600: "εξακόσιες",
700: "επτακόσιες",
800: "οκτακόσιες",
900: "εννιακόσιες",
1000: "χίλιες",
}
def capital(word):
result = (
word.upper()
.replace(u"Έ", u"Ε")
.replace(u"Ό", u"Ο")
.replace(u"Ά", u"Α")
.replace(u"Ύ", u"Υ")
.replace(u"Ώ", u"Ω")
.replace(u"Ί", u"Ι")
.replace(u"Ή", u"Η")
)
return result
def n2w(n, capitalize=False, female=False):
lookup_dict = num2words
if female:
lookup_dict = num2words_f
rv = ""
if n <= 20:
rv = lookup_dict[n]
elif n > 20 and n < 100:
if n % 10 == 0:
rv = lookup_dict[n - n % 10]
else:
rv = lookup_dict[n - n % 10] + " " + lookup_dict[n % 10]
elif n == 100:
rv = lookup_dict[n]
elif n > 100 and n < 1000:
if (n % 100) == 0:
rv = lookup_dict[n - n % 100]
elif (n % 100) <= 20:
rv = lookup_dict[n - n % 100] + " " + lookup_dict[n % 100]
else:
if (n % 10) == 0:
rv = (
lookup_dict[n - n % 100]
+ " "
+ lookup_dict[n % 100 - (n % 100) % 10]
)
else:
rv = (
lookup_dict[n - n % 100]
+ " "
+ lookup_dict[n % 100 - (n % 100) % 10]
+ " "
+ lookup_dict[n % 10]
)
elif n == 1000:
rv = lookup_dict[1000]
elif n > 1000 and n < 2000:
rv = (
lookup_dict[1000]
+ " "
+ n2w(n - 1000, capitalize=capitalize, female=female)
)
elif n >= 2000 and n <= 999999:
rv = n2w(n // 1000, capitalize=capitalize, female=True) + " χιλιάδες"
m = n % 1000
if m:
rv += " " + n2w(m, capitalize=capitalize, female=female)
if capitalize is True:
return capital(rv)
else:
return rv
class TestN2W(unittest.TestCase):
def test_lower(self):
self.assertEqual(n2w(111), "εκατόν έντεκα")
self.assertEqual(n2w(1), "ένα")
self.assertEqual(n2w(10), "δέκα")
self.assertEqual(n2w(525), "πεντακόσια είκοσι πέντε")
self.assertEqual(n2w(777), "επτακόσια εβδομήντα επτά")
self.assertEqual(n2w(42), "σαράντα δύο")
self.assertEqual(n2w(85), "ογδόντα πέντε")
self.assertEqual(n2w(1853), "χίλια οκτακόσια πενήντα τρία")
self.assertEqual(n2w(2555), "δύο χιλιάδες πεντακόσια πενήντα πέντε")
self.assertEqual(
n2w(883123), "οκτακόσιες ογδόντα τρείς χιλιάδες εκατόν είκοσι τρία"
)
def test_caps(self):
n2wc = lambda z: n2w(z, capitalize=True)
self.assertEqual(n2wc(111), "ΕΚΑΤΟΝ ΕΝΤΕΚΑ")
self.assertEqual(n2wc(1), "ΕΝΑ")
self.assertEqual(n2wc(10), "ΔΕΚΑ")
self.assertEqual(n2wc(525), "ΠΕΝΤΑΚΟΣΙΑ ΕΙΚΟΣΙ ΠΕΝΤΕ")
self.assertEqual(n2wc(777), "ΕΠΤΑΚΟΣΙΑ ΕΒΔΟΜΗΝΤΑ ΕΠΤΑ")
self.assertEqual(n2wc(777), "ΕΠΤΑΚΟΣΙΑ ΕΒΔΟΜΗΝΤΑ ΕΠΤΑ")
self.assertEqual(n2wc(42), "ΣΑΡΑΝΤΑ ΔΥΟ")
self.assertEqual(n2wc(1000), "ΧΙΛΙΑ")
self.assertEqual(n2wc(1132), "ΧΙΛΙΑ ΕΚΑΤΟΝ ΤΡΙΑΝΤΑ ΔΥΟ")
self.assertEqual(n2wc(2000), "ΔΥΟ ΧΙΛΙΑΔΕΣ")
self.assertEqual(n2wc(95000), "ΕΝΕΝΗΝΤΑ ΠΕΝΤΕ ΧΙΛΙΑΔΕΣ")
self.assertEqual(n2wc(543002), "ΠΕΝΤΑΚΟΣΙΕΣ ΣΑΡΑΝΤΑ ΤΡΕΙΣ ΧΙΛΙΑΔΕΣ ΔΥΟ")
self.assertEqual(n2wc(999999), "ΕΝΝΙΑΚΟΣΙΕΣ ΕΝΕΝΗΝΤΑ ΕΝΝΕΑ ΧΙΛΙΑΔΕΣ ΕΝΝΙΑΚΟΣΙΑ ΕΝΕΝΗΝΤΑ ΕΝΝΕΑ")
if __name__ == "__main__":
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment