From a659e63eb5ab813fa0de6328285dba92d8fb6d80 Mon Sep 17 00:00:00 2001 From: Tufan Kaynak <31142607+toofun666@users.noreply.github.com> Date: Wed, 30 Aug 2017 19:36:29 +0300 Subject: [PATCH] TR translation TR translation of num2word reading all cardinals and ordinals up to 10**21-1 --- num2words/__init__.py | 4 +- num2words/lang_TR.py | 575 ++++++++++++++++++++++++++++++++++++++++++ tests/test_tr.py | 104 ++++++++ 3 files changed, 682 insertions(+), 1 deletion(-) create mode 100644 num2words/lang_TR.py create mode 100644 tests/test_tr.py diff --git a/num2words/__init__.py b/num2words/__init__.py index 69ad8db..58eabfb 100644 --- a/num2words/__init__.py +++ b/num2words/__init__.py @@ -37,6 +37,7 @@ from . import lang_IT from . import lang_ES_VE from . import lang_ES_CO from . import lang_VN +from . import lang_TR CONVERTER_CLASSES = { @@ -60,7 +61,8 @@ CONVERTER_CLASSES = { 'pt_BR': lang_PT_BR.Num2Word_PT_BR(), 'he': lang_HE.Num2Word_HE(), 'it': lang_IT.Num2Word_IT(), - 'vi_VN': lang_VN.Num2Word_VN() + 'vi_VN': lang_VN.Num2Word_VN(), + 'tr': lang_TR.Num2Word_TR() } def num2words(number, ordinal=False, lang='en'): diff --git a/num2words/lang_TR.py b/num2words/lang_TR.py new file mode 100644 index 0000000..7b011c1 --- /dev/null +++ b/num2words/lang_TR.py @@ -0,0 +1,575 @@ +# -*- encoding: utf-8 -*- +# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. +# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. +# Copyright (c) 2017, Tufan Kaynak, Framras. All Rights Reserved. + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA + +from __future__ import unicode_literals + + +class Num2Word_TR(object): + def __init__(self): + self.precision = 2 + self.negword = u"eksi " + self.pointword = u"virgül" + self.CURRENCY_UNIT = (u"lira",) + self.CURRENCY_SUBUNIT = (u"kuruş",) + # type(%s) not in [long, int, float] + self.errmsg_nonnum = u"Sadece sayılar yazıya çevrilebilir." + # Cannot treat float %s as ordinal. + self.errmsg_floatord = u"Tam sayı olmayan {} sıralamada kullanılamaz." + # Cannot treat negative num %s as ordinal. + self.errmsg_negord = u"Pozitif olmayan {} sıralamada kullanılamaz." + # abs(%s) must be less than %s. + self.errmsg_toobig = u"abs({}) sayı yazıya çevirmek için çok büyük. Yazıya çevrilebilecek en büyük rakam {}." + self.exclude_title = ["et", "virgule", "moins"] + # ordered number tuples in Turkish + self.ORDINAL_SIGN = (",",) + self.CARDINAL_BIRLER = ( + u"sıfır", u"bir", u"iki", u"üç", u"dört", u"beş", u"altı", u"yedi", u"sekiz", u"dokuz",) + self.ORDINAL_BIRLER = ( + u"", u"birinci", u"ikinci", u"üçüncü", u"dördüncü", u"beşinci", u"altıncı", u"yedinci", u"sekizinci", u"dokuzuncu",) + self.CARDINAL_ONLAR = ( + u"", u"on", u"yirmi", u"otuz", u"kırk", u"elli", u"altmış", u"yetmiş", u"seksen", u"doksan",) + self.ORDINAL_ONLAR = ( + u"", u"onuncu", u"yirminci", u"otuzuncu", u"kırkıncı", u"ellinci", u"altmışıncı", u"yetmişinci", u"sekseninci", + u"doksanıncı",) + self.CARDINAL_YUZLER = (u"yüz",) + self.ORDINAL_YUZLER = (u"yüzüncü",) + self.CARDINAL_UCLU_GRUPLAR = (u"", u"bin", u"milyon", u"milyar", u"trilyon", u"katrilyon", u"kentilyon",) + self.ORDINAL_UCLU_GRUPLAR = ( + u"", u"bininci", u"milyonuncu", u"milyarıncı", u"trilyonuncu", u"katrilyonuncu", u"kentilyon",) + self.MAXVAL = (10 ** (len(self.CARDINAL_UCLU_GRUPLAR) * 3)) - 1 + + self.okunacak_tam_sayi = [] + self.okunacak_uclu_grup_sayisi = 0 + self.okunacak_artik_basamak_sayisi = 0 + self.son_sifir_basamagi = 0 + + # def set_numwords(self): + + # def gen_high_numwords(self, units, tens, lows): + + # def set_mid_numwords(self, mid): + + # def set_low_numwords(self, numwords): + + def splitnum(self, value): + return self.to_splitnum(value) + + def to_cardinal(self, value): + oku = "" + is_cardinal = self.verify_cardinal(value) + if is_cardinal: + if not int(value) == value: + return self.to_cardinal_float(value) + self.splitnum(value) + + if self.son_sifir_basamagi >= len(self.okunacak_tam_sayi[0]): + # number like 00 and all 0s and even more, raise error + return oku + + if self.okunacak_uclu_grup_sayisi == 1: + if self.okunacak_artik_basamak_sayisi == 2: + if self.son_sifir_basamagi == 1: + # number like x0, read cardinal x0 and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + return oku + if self.son_sifir_basamagi == 0: + # number like xy, read cardinal xy and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + if not self.okunacak_tam_sayi[0][0] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][1])] + return oku + + if self.okunacak_artik_basamak_sayisi == 1: + if self.son_sifir_basamagi == 0: + # number like x, read ordinal x and return + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + return oku + + if self.okunacak_artik_basamak_sayisi == 0: + if self.son_sifir_basamagi == 2: + # number like x00, read cardinal x00 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + return oku + if self.son_sifir_basamagi == 1: + # number like xy0, read cardinal xy0 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + return oku + if self.son_sifir_basamagi == 0: + # number like xyz, read cardinal xyz and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + if not self.okunacak_tam_sayi[0][2] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][2])] + return oku + + if self.okunacak_uclu_grup_sayisi >= 2: + if self.okunacak_artik_basamak_sayisi == 2: + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 1: + # number like x0 and all 0s, read cardinal x0 0..0 and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 2: + # number like xy and all 0s, read cardinal xy 0..0 and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + if not self.okunacak_tam_sayi[0][1] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][1])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi < len(self.okunacak_tam_sayi[0]) - 2: + # number like xy and others, read cardinal xy n..n and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + if not self.okunacak_tam_sayi[0][1] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][1])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + + if self.okunacak_artik_basamak_sayisi == 1: + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 1: + # number like x and all 0s, read cardinal x 0..0 and return + if not (self.okunacak_uclu_grup_sayisi == 2 and self.okunacak_tam_sayi[0][0] == "1"): + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi < len(self.okunacak_tam_sayi[0]) - 1: + # number like x and others, read cardinal x n..n and return + if not (self.okunacak_uclu_grup_sayisi == 2 and self.okunacak_tam_sayi[0][0] == "1"): + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + + if self.okunacak_artik_basamak_sayisi == 0: + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 1: + # number like x00 and all 0s, read cardinal x00 0..0 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 2: + # number like xy0 and all 0s, read cardinal xy0 0..0 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 3: + # number like xyz and all 0s, read cardinal xyz 0..0 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + if not self.okunacak_tam_sayi[0][2] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][2])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi < len(self.okunacak_tam_sayi[0]) - 3: + # number like xyz and all others, read cardinal xyz n..n + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + if not self.okunacak_tam_sayi[0][2] == "0": + if not (self.okunacak_uclu_grup_sayisi == 2 and self.okunacak_tam_sayi[0][2] == "1"): + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][2])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + + for i in list(range(self.okunacak_uclu_grup_sayisi - 1, 0, -1)): + okunan_grup_sirasi = self.okunacak_uclu_grup_sayisi - i + if self.okunacak_artik_basamak_sayisi == 0: + son_okunan_basamak_sirasi = okunan_grup_sirasi * 3 + else: + son_okunan_basamak_sirasi = (okunan_grup_sirasi - 1) * 3 + self.okunacak_artik_basamak_sayisi + + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi: son_okunan_basamak_sirasi + 3] == "000": + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi] == "0": + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi] == "1": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi])] + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - ( + son_okunan_basamak_sirasi) - 1: + if i == 1: + oku += self.CARDINAL_YUZLER[0] + return oku + elif i > 1: + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_UCLU_GRUPLAR[i - 1] + return oku + else: + oku += self.CARDINAL_YUZLER[0] + + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 1] == "0": + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - ( + son_okunan_basamak_sirasi) - 2: + if i == 1: + oku += self.CARDINAL_ONLAR[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 1])] + return oku + elif i > 1: + oku += self.CARDINAL_ONLAR[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 1])] + oku += self.CARDINAL_UCLU_GRUPLAR[i - 1] + return oku + else: + oku += self.CARDINAL_ONLAR[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 1])] + + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2] == "0": + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - ( + son_okunan_basamak_sirasi) - 3: + if i == 1: + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + return oku + if i == 2: + if not self.okunacak_tam_sayi[0][ + son_okunan_basamak_sirasi: son_okunan_basamak_sirasi + 2] == "00": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + elif not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2] == "1": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + oku += self.CARDINAL_UCLU_GRUPLAR[i - 1] + return oku + if i > 2: + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + oku += self.CARDINAL_UCLU_GRUPLAR[i - 1] + return oku + else: + if not self.okunacak_tam_sayi[0][ + son_okunan_basamak_sirasi: son_okunan_basamak_sirasi + 2] == "00": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + else: + if i == 2: + if not self.okunacak_tam_sayi[0][ + son_okunan_basamak_sirasi: son_okunan_basamak_sirasi + 2] == "00": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + elif not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2] == "1": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + + oku += self.CARDINAL_UCLU_GRUPLAR[i - 1] + + return oku + + def to_cardinal_float(self, value): + self.splitnum(value) + oku = "" + oku += self.pointword + if len(self.okunacak_tam_sayi[1]) >= 1: + if not self.okunacak_tam_sayi[1][0] == "0": + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[1][0])] + if len(self.okunacak_tam_sayi[1]) == 2: + if not self.okunacak_tam_sayi[1][1] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[1][1])] + oku = self.to_cardinal(int(self.okunacak_tam_sayi[0])) + oku + return oku + + # def merge(self, curr, next): + + # def clean(self, val): + + # def title(self, value): + + def verify_cardinal(self, value): + iscardinal = True + try: + if not float(value) == value: + iscardinal = False + except (ValueError, TypeError): + iscardinal = False + raise TypeError(self.errmsg_nonnum) + if abs(value) >= self.MAXVAL: + iscardinal = False + raise OverflowError(self.errmsg_toobig.format(value, self.MAXVAL)) + return iscardinal + + def verify_ordinal(self, value): + isordinal = True + try: + if not int(value) == value: + isordinal = False + if not abs(value) == value: + isordinal = False + raise TypeError(self.errmsg_negord.format(value)) + except (ValueError, TypeError): + isordinal = False + raise TypeError(self.errmsg_nonnum) + if abs(value) >= self.MAXVAL: + isordinal = False + raise OverflowError(self.errmsg_toobig.format(value, self.MAXVAL)) + return isordinal + + # def verify_num(self, value): + + # def set_wordnums(self): + + def to_ordinal(self, value): + oku = "" + isordinal = self.verify_ordinal(value) + if isordinal: + self.splitnum(value) + + if self.son_sifir_basamagi >= len(self.okunacak_tam_sayi[0]): + # number like 00 and all 0s and even more, raise error + return oku + + if self.okunacak_uclu_grup_sayisi == 1: + if self.okunacak_artik_basamak_sayisi == 2: + if self.son_sifir_basamagi == 1: + # number like x0, read ordinal x0 and return + oku += self.ORDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + return oku + if self.son_sifir_basamagi == 0: + # number like xy, read ordinal xy and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + if not self.okunacak_tam_sayi[0][0] == "0": + oku += self.ORDINAL_BIRLER[int(self.okunacak_tam_sayi[0][1])] + return oku + + if self.okunacak_artik_basamak_sayisi == 1: + if self.son_sifir_basamagi == 0: + # number like x, read ordinal x and return + oku += self.ORDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + return oku + + if self.okunacak_artik_basamak_sayisi == 0: + if self.son_sifir_basamagi == 2: + # number like x00, read ordinal x00 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.ORDINAL_YUZLER[0] + return oku + if self.son_sifir_basamagi == 1: + # number like xy0, read ordinal xy0 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.ORDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + return oku + if self.son_sifir_basamagi == 0: + # number like xyz, read ordinal xyz and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + if not self.okunacak_tam_sayi[0][2] == "0": + oku += self.ORDINAL_BIRLER[int(self.okunacak_tam_sayi[0][2])] + return oku + + if self.okunacak_uclu_grup_sayisi >= 2: + if self.okunacak_artik_basamak_sayisi == 2: + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 1: + # number like x0 and all 0s, read ordinal x0 0..0 and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + oku += self.ORDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 2: + # number like xy and all 0s, read ordinal xy 0..0 and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + if not self.okunacak_tam_sayi[0][1] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][1])] + oku += self.ORDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi < len(self.okunacak_tam_sayi[0]) - 2: + # number like xy and others, read cardinal xy n..n and return + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][0])] + if not self.okunacak_tam_sayi[0][1] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][1])] + + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + + if self.okunacak_artik_basamak_sayisi == 1: + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 1: + # number like x and all 0s, read ordinal x 0..0 and return + if not (self.okunacak_uclu_grup_sayisi == 2 and self.okunacak_tam_sayi[0][0] == "1"): + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.ORDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi < len(self.okunacak_tam_sayi[0]) - 1: + # number like x and others, read cardinal x n..n and return + if not (self.okunacak_uclu_grup_sayisi == 2 and self.okunacak_tam_sayi[0][0] == "1"): + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + + if self.okunacak_artik_basamak_sayisi == 0: + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 1: + # number like x00 and all 0s, read ordinal x00 0..0 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.ORDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 2: + # number like xy0 and all 0s, read ordinal xy0 0..0 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + oku += self.ORDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - 3: + # number like xyz and all 0s, read ordinal xyz 0..0 and return + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + if not self.okunacak_tam_sayi[0][2] == "0": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][2])] + oku += self.ORDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + return oku + if self.son_sifir_basamagi < len(self.okunacak_tam_sayi[0]) - 3: + # number like xyz and all others, read cardinal xyz n..n + if not self.okunacak_tam_sayi[0][0] == "1": + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][0])] + oku += self.CARDINAL_YUZLER[0] + oku += self.CARDINAL_ONLAR[int(self.okunacak_tam_sayi[0][1])] + if not self.okunacak_tam_sayi[0][2] == "0": + if not (self.okunacak_uclu_grup_sayisi == 2 and self.okunacak_tam_sayi[0][2] == "1"): + oku += self.CARDINAL_BIRLER[int(self.okunacak_tam_sayi[0][2])] + oku += self.CARDINAL_UCLU_GRUPLAR[self.okunacak_uclu_grup_sayisi - 1] + + for i in list(range(self.okunacak_uclu_grup_sayisi - 1, 0, -1)): + okunan_grup_sirasi = self.okunacak_uclu_grup_sayisi - i + if self.okunacak_artik_basamak_sayisi == 0: + son_okunan_basamak_sirasi = okunan_grup_sirasi * 3 + else: + son_okunan_basamak_sirasi = (okunan_grup_sirasi - 1) * 3 + self.okunacak_artik_basamak_sayisi + + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi: son_okunan_basamak_sirasi + 3] == "000": + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi] == "0": + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi] == "1": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi])] + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - ( + son_okunan_basamak_sirasi) - 1: + if i == 1: + oku += self.ORDINAL_YUZLER[0] + return oku + elif i > 1: + oku += self.CARDINAL_YUZLER[0] + oku += self.ORDINAL_UCLU_GRUPLAR[i - 1] + return oku + else: + oku += self.CARDINAL_YUZLER[0] + + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 1] == "0": + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - ( + son_okunan_basamak_sirasi) - 2: + if i == 1: + oku += self.ORDINAL_ONLAR[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 1])] + return oku + elif i > 1: + oku += self.CARDINAL_ONLAR[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 1])] + oku += self.ORDINAL_UCLU_GRUPLAR[i - 1] + return oku + else: + oku += self.CARDINAL_ONLAR[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 1])] + + if not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2] == "0": + if self.son_sifir_basamagi == len(self.okunacak_tam_sayi[0]) - ( + son_okunan_basamak_sirasi) - 3: + if i == 1: + oku += self.ORDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + return oku + if i == 2: + if not self.okunacak_tam_sayi[0][ + son_okunan_basamak_sirasi: son_okunan_basamak_sirasi + 2] == "00": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + elif not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2] == "1": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + oku += self.ORDINAL_UCLU_GRUPLAR[i - 1] + return oku + if i > 2: + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + oku += self.ORDINAL_UCLU_GRUPLAR[i - 1] + return oku + else: + if not self.okunacak_tam_sayi[0][ + son_okunan_basamak_sirasi: son_okunan_basamak_sirasi + 2] == "00": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + else: + if not self.okunacak_tam_sayi[0][ + son_okunan_basamak_sirasi: son_okunan_basamak_sirasi + 2] == "00": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + elif not self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2] == "1": + oku += self.CARDINAL_BIRLER[ + int(self.okunacak_tam_sayi[0][son_okunan_basamak_sirasi + 2])] + + oku += self.CARDINAL_UCLU_GRUPLAR[i - 1] + + return oku + + def to_ordinal_num(self, value): + oku = "" + isordinal = self.verify_ordinal(value) + if isordinal: + self.splitnum(value) + oku = self.okunacak_tam_sayi[0] + self.ORDINAL_SIGN[0] + + return oku + + # def inflect(self, value, text): + + def to_splitnum(self, val, hightxt="", lowtxt="", jointxt="", divisor=100, longval=True, cents=True): + kesirlibolum = str(int(val * 10**self.precision)) + self.okunacak_tam_sayi = [str(int(val)), kesirlibolum[len(kesirlibolum)-self.precision:]] + if len(self.okunacak_tam_sayi[0]) % 3 > 0: + self.okunacak_uclu_grup_sayisi = (len(self.okunacak_tam_sayi[0]) // 3) + 1 + elif len(self.okunacak_tam_sayi[0]) % 3 == 0: + self.okunacak_uclu_grup_sayisi = len(self.okunacak_tam_sayi[0]) // 3 + self.okunacak_artik_basamak_sayisi = len(self.okunacak_tam_sayi[0]) % 3 + + okunacak = list(self.okunacak_tam_sayi[0][::-1]) + self.son_sifir_basamagi = 0 + found = 0 + for i in range(len(okunacak) - 1): + if int(okunacak[i]) == 0 and found == 0: + self.son_sifir_basamagi = i + 1 + else: + found = 1 + + def to_year(self, value, **kwargs): + return self.to_cardinal(value) + + def to_currency(self, value, **kwargs): + return self.to_cardinal(value) + + # def base_setup(self): + + # def setup(self): + + # def test(self, value): diff --git a/tests/test_tr.py b/tests/test_tr.py new file mode 100644 index 0000000..46210b6 --- /dev/null +++ b/tests/test_tr.py @@ -0,0 +1,104 @@ +# -*- encoding: utf-8 -*- +# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. +# Copyright (c) 2017, Tufan Kaynak, Framras. All Rights Reserved. + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA + +from unittest import TestCase + +from num2words import num2words + + +class Num2WordsTRTest(TestCase): + def test_tr(self): + # ref https://github.com/savoirfairelinux/num2words/issues/8 + + self.assertEqual(num2words(1, True, "tr"), u"birinci") + self.assertEqual(num2words(2, True, "tr"), u"ikinci") + self.assertEqual(num2words(9, True, "tr"), u"dokuzuncu") + self.assertEqual(num2words(10, True, "tr"), u"onuncu") + self.assertEqual(num2words(11, True, "tr"), u"onbirinci") + self.assertEqual(num2words(44, True, "tr"), u"kırkdördüncü") + self.assertEqual(num2words(100, True, "tr"), u"yüzüncü") + self.assertEqual(num2words(101, True, "tr"), u"yüzbirinci") + self.assertEqual(num2words(103, True, "tr"), u"yüzüçüncü") + self.assertEqual(num2words(110, True, "tr"), u"yüzonuncu") + self.assertEqual(num2words(1000, True, "tr"), u"bininci") + self.assertEqual(num2words(1001, True, "tr"), u"binbirinci") + self.assertEqual(num2words(10000, True, "tr"), u"onbininci") + self.assertEqual(num2words(10100, True, "tr"), u"onbinyüzüncü") + self.assertEqual(num2words(11000, True, "tr"), u"onbirbininci") + self.assertEqual(num2words(35000, True, "tr"), u"otuzbeşbininci") + self.assertEqual(num2words(116331, True, "tr"), u"yüzonaltıbinüçyüzotuzbirinci") + self.assertEqual(num2words(116330, True, "tr"), u"yüzonaltıbinüçyüzotuzuncu") + self.assertEqual(num2words(100000, True, "tr"), u"yüzbininci") + self.assertEqual(num2words(501000, True, "tr"), u"beşyüzbirbininci") + self.assertEqual(num2words(1000111, True, "tr"), u"birmilyonyüzonbirinci") + self.assertEqual(num2words(111000111, True, "tr"), u"yüzonbirmilyonyüzonbirinci") + self.assertEqual(num2words(111001111, True, "tr"), u"yüzonbirmilyonbinyüzonbirinci") + self.assertEqual(num2words(111111111, True, "tr"), u"yüzonbirmilyonyüzonbirbinyüzonbirinci") + self.assertEqual(num2words(100001000, True, "tr"), u"yüzmilyonbininci") + self.assertEqual(num2words(100001001, True, "tr"), u"yüzmilyonbinbirinci") + self.assertEqual(num2words(100010000, True, "tr"), u"yüzmilyononbininci") + self.assertEqual(num2words(100010001, True, "tr"), u"yüzmilyononbinbirinci") + self.assertEqual(num2words(100011000, True, "tr"), u"yüzmilyononbirbininci") + self.assertEqual(num2words(100011001, True, "tr"), u"yüzmilyononbirbinbirinci") + self.assertEqual(num2words(101011001, True, "tr"), u"yüzbirmilyononbirbinbirinci") + self.assertEqual(num2words(101011010, True, "tr"), u"yüzbirmilyononbirbinonuncu") + self.assertEqual(num2words(1101011010, True, "tr"), u"birmilyaryüzbirmilyononbirbinonuncu") + self.assertEqual(num2words(101101011010, True, "tr"), u"yüzbirmilyaryüzbirmilyononbirbinonuncu") + self.assertEqual(num2words(1000000000001, True, "tr"), u"birtrilyonbirinci") + + self.assertEqual(num2words(1, False, "tr"), u"bir") + self.assertEqual(num2words(2, False, "tr"), u"iki") + self.assertEqual(num2words(9, False, "tr"), u"dokuz") + self.assertEqual(num2words(10, False, "tr"), u"on") + self.assertEqual(num2words(11, False, "tr"), u"onbir") + self.assertEqual(num2words(44, False, "tr"), u"kırkdört") + self.assertEqual(num2words(100, False, "tr"), u"yüz") + self.assertEqual(num2words(101, False, "tr"), u"yüzbir") + self.assertEqual(num2words(103, False, "tr"), u"yüzüç") + self.assertEqual(num2words(110, False, "tr"), u"yüzon") + self.assertEqual(num2words(1000, False, "tr"), u"bin") + self.assertEqual(num2words(1001, False, "tr"), u"binbir") + self.assertEqual(num2words(10000, False, "tr"), u"onbin") + self.assertEqual(num2words(10100, False, "tr"), u"onbinyüz") + self.assertEqual(num2words(11000, False, "tr"), u"onbirbin") + self.assertEqual(num2words(35000, False, "tr"), u"otuzbeşbin") + self.assertEqual(num2words(116331, False, "tr"), u"yüzonaltıbinüçyüzotuzbir") + self.assertEqual(num2words(116330, False, "tr"), u"yüzonaltıbinüçyüzotuz") + self.assertEqual(num2words(500000, False, "tr"), u"beşyüzbin") + self.assertEqual(num2words(501000, False, "tr"), u"beşyüzbirbin") + self.assertEqual(num2words(1000111, False, "tr"), u"birmilyonyüzonbir") + self.assertEqual(num2words(111000111, False, "tr"), u"yüzonbirmilyonyüzonbir") + self.assertEqual(num2words(111001111, False, "tr"), u"yüzonbirmilyonbinyüzonbir") + self.assertEqual(num2words(111111111, False, "tr"), u"yüzonbirmilyonyüzonbirbinyüzonbir") + self.assertEqual(num2words(100001000, False, "tr"), u"yüzmilyonbin") + self.assertEqual(num2words(100001001, False, "tr"), u"yüzmilyonbinbir") + self.assertEqual(num2words(100010000, False, "tr"), u"yüzmilyononbin") + self.assertEqual(num2words(100010001, False, "tr"), u"yüzmilyononbinbir") + self.assertEqual(num2words(100011000, False, "tr"), u"yüzmilyononbirbin") + self.assertEqual(num2words(100011001, False, "tr"), u"yüzmilyononbirbinbir") + self.assertEqual(num2words(101011001, False, "tr"), u"yüzbirmilyononbirbinbir") + self.assertEqual(num2words(101011010, False, "tr"), u"yüzbirmilyononbirbinon") + self.assertEqual(num2words(1101011010, False, "tr"), u"birmilyaryüzbirmilyononbirbinon") + self.assertEqual(num2words(101101011010, False, "tr"), u"yüzbirmilyaryüzbirmilyononbirbinon") + self.assertEqual(num2words(1000000000001, False, "tr"), u"birtrilyonbir") + self.assertEqual(num2words(0.1, False, "tr"), u"sıfırvirgülon") + self.assertEqual(num2words(0.21, False, "tr"), u"sıfırvirgülyirmibir") + self.assertEqual(num2words(1.01, False, "tr"), u"birvirgülbir") + self.assertEqual(num2words(1.1, False, "tr"), u"birvirgülon") + self.assertEqual(num2words(1.21, False, "tr"), u"birvirgülyirmibir") + self.assertEqual(num2words(101101011010.02, False, "tr"), u"yüzbirmilyaryüzbirmilyononbirbinonvirgüliki") + self.assertEqual(num2words(101101011010.2, False, "tr"), u"yüzbirmilyaryüzbirmilyononbirbinonvirgülyirmi")