mirror of
https://github.com/bblaz/num2words.git
synced 2025-12-06 06:42:25 +00:00
add ru lang into supported languages
This commit is contained in:
committed by
Virgil Dupras
parent
eacf57fd26
commit
b9b6a8de42
@@ -50,6 +50,7 @@ Besides the numerical argument, there's two optional arguments.
|
|||||||
* ``en_GB`` (British English)
|
* ``en_GB`` (British English)
|
||||||
* ``en_IN`` (Indian English)
|
* ``en_IN`` (Indian English)
|
||||||
* ``pl`` (Polish)
|
* ``pl`` (Polish)
|
||||||
|
* ``ru`` (Russian)
|
||||||
|
|
||||||
You can supply values like ``fr_FR``, the code will be
|
You can supply values like ``fr_FR``, the code will be
|
||||||
correctly interpreted. If you supply an unsupported language, ``NotImplementedError`` is raised.
|
correctly interpreted. If you supply an unsupported language, ``NotImplementedError`` is raised.
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ from . import lang_ES
|
|||||||
from . import lang_LT
|
from . import lang_LT
|
||||||
from . import lang_LV
|
from . import lang_LV
|
||||||
from . import lang_PL
|
from . import lang_PL
|
||||||
|
from . import lang_RU
|
||||||
|
|
||||||
CONVERTER_CLASSES = {
|
CONVERTER_CLASSES = {
|
||||||
'en': lang_EN.Num2Word_EN(),
|
'en': lang_EN.Num2Word_EN(),
|
||||||
@@ -38,6 +39,7 @@ CONVERTER_CLASSES = {
|
|||||||
'lt': lang_LT.Num2Word_LT(),
|
'lt': lang_LT.Num2Word_LT(),
|
||||||
'lv': lang_LV.Num2Word_LV(),
|
'lv': lang_LV.Num2Word_LV(),
|
||||||
'pl': lang_PL.Num2Word_PL(),
|
'pl': lang_PL.Num2Word_PL(),
|
||||||
|
'ru': lang_RU.Num2Word_RU(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def num2words(number, ordinal=False, lang='en'):
|
def num2words(number, ordinal=False, lang='en'):
|
||||||
|
|||||||
309
num2words/lang_RU.py
Normal file
309
num2words/lang_RU.py
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
||||||
|
# Copyright (c) 2013, Savoir-faire Linux inc. 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
|
||||||
|
u"""
|
||||||
|
>>> from textwrap import fill
|
||||||
|
|
||||||
|
>>> ' '.join([str(i) for i in splitby3('1')])
|
||||||
|
u'1'
|
||||||
|
>>> ' '.join([str(i) for i in splitby3('1123')])
|
||||||
|
u'1 123'
|
||||||
|
>>> ' '.join([str(i) for i in splitby3('1234567890')])
|
||||||
|
u'1 234 567 890'
|
||||||
|
|
||||||
|
>>> print(' '.join([n2w(i) for i in range(10)]))
|
||||||
|
ноль один два три четыре пять шесть семь восемь девять
|
||||||
|
|
||||||
|
>>> print(fill(' '.join([n2w(i+10) for i in range(10)])))
|
||||||
|
десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать
|
||||||
|
шестнадцать семнадцать восемнадцать девятнадцать
|
||||||
|
|
||||||
|
>>> print(fill(' '.join([n2w(i*10) for i in range(10)])))
|
||||||
|
ноль десять двадцать тридцать сорок пятьдесят шестьдесят семьдесят
|
||||||
|
восемьдесят девяносто
|
||||||
|
|
||||||
|
>>> print(n2w(100))
|
||||||
|
сто
|
||||||
|
>>> print(n2w(101))
|
||||||
|
сто один
|
||||||
|
>>> print(n2w(110))
|
||||||
|
сто десять
|
||||||
|
>>> print(n2w(115))
|
||||||
|
сто пятнадцать
|
||||||
|
>>> print(n2w(123))
|
||||||
|
сто двадцать три
|
||||||
|
>>> print(n2w(1000))
|
||||||
|
тысяча
|
||||||
|
>>> print(n2w(1001))
|
||||||
|
тысяча один
|
||||||
|
>>> print(n2w(2012))
|
||||||
|
две тысячи двенадцать
|
||||||
|
|
||||||
|
>>> print(n2w(12519.85))
|
||||||
|
двенадцать тысяч пятьсот девятнадцать запятая восемьдесят пять
|
||||||
|
|
||||||
|
>>> print(fill(n2w(1234567890)))
|
||||||
|
миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч
|
||||||
|
восемьсот девяносто
|
||||||
|
|
||||||
|
>>> print(fill(n2w(215461407892039002157189883901676)))
|
||||||
|
двести пятнадцать нониллионов четыреста шестьдесят один октиллион
|
||||||
|
четыреста семь септиллионов восемьсот девяносто два секстиллиона
|
||||||
|
тридцать девять квинтиллионов два квадриллиона сто пятьдесят семь
|
||||||
|
триллионов сто восемьдесят девять миллиардов восемьсот восемьдесят три
|
||||||
|
миллиона девятьсот одна тысяча шестьсот семьдесят шесть
|
||||||
|
|
||||||
|
>>> print(fill(n2w(719094234693663034822824384220291)))
|
||||||
|
семьсот девятнадцать нониллионов девяносто четыре октиллиона двести
|
||||||
|
тридцать четыре септиллиона шестьсот девяносто три секстиллиона
|
||||||
|
шестьсот шестьдесят три квинтиллиона тридцать четыре квадриллиона
|
||||||
|
восемьсот двадцать два триллиона восемьсот двадцать четыре миллиарда
|
||||||
|
триста восемьдесят четыре миллиона двести двадцать тысяч двести
|
||||||
|
девяносто один
|
||||||
|
|
||||||
|
>>> print(to_currency(1.0, 'EUR'))
|
||||||
|
один евро, ноль центов
|
||||||
|
|
||||||
|
>>> print(to_currency(1.0, 'RUB'))
|
||||||
|
один рубль, ноль копеек
|
||||||
|
|
||||||
|
>>> print(to_currency(1234.56, 'EUR'))
|
||||||
|
тысяча двести тридцать четыре евро, пятьдесят шесть центов
|
||||||
|
|
||||||
|
>>> print(to_currency(1234.56, 'RUB'))
|
||||||
|
тысяча двести тридцать четыре рубля, пятьдесят шесть копеек
|
||||||
|
|
||||||
|
>>> print(to_currency(10111, 'EUR', seperator=u' и'))
|
||||||
|
сто один евро и одиннадцать центов
|
||||||
|
|
||||||
|
>>> print(to_currency(10121, 'RUB', seperator=u' и'))
|
||||||
|
сто один рубль и двадцать одна копейка
|
||||||
|
|
||||||
|
>>> print(to_currency(10122, 'RUB', seperator=u' и'))
|
||||||
|
сто один рубль и двадцать две копейки
|
||||||
|
|
||||||
|
>>> print(to_currency(10121, 'EUR', seperator=u' и'))
|
||||||
|
сто один евро и двадцать один цент
|
||||||
|
|
||||||
|
>>> print(to_currency(-1251985, cents = False))
|
||||||
|
минус двенадцать тысяч пятьсот девятнадцать евро, 85 центов
|
||||||
|
"""
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
ZERO = (u'ноль',)
|
||||||
|
|
||||||
|
ONES_FEMININE = {
|
||||||
|
1: (u'одна',),
|
||||||
|
2: (u'две',),
|
||||||
|
3: (u'три',),
|
||||||
|
4: (u'четыре',),
|
||||||
|
5: (u'пять',),
|
||||||
|
6: (u'шесть',),
|
||||||
|
7: (u'семь',),
|
||||||
|
8: (u'восемь',),
|
||||||
|
9: (u'девять',),
|
||||||
|
}
|
||||||
|
|
||||||
|
ONES = {
|
||||||
|
1: (u'один',),
|
||||||
|
2: (u'два',),
|
||||||
|
3: (u'три',),
|
||||||
|
4: (u'четыре',),
|
||||||
|
5: (u'пять',),
|
||||||
|
6: (u'шесть',),
|
||||||
|
7: (u'семь',),
|
||||||
|
8: (u'восемь',),
|
||||||
|
9: (u'девять',),
|
||||||
|
}
|
||||||
|
|
||||||
|
TENS = {
|
||||||
|
0: (u'десять',),
|
||||||
|
1: (u'одиннадцать',),
|
||||||
|
2: (u'двенадцать',),
|
||||||
|
3: (u'тринадцать',),
|
||||||
|
4: (u'четырнадцать',),
|
||||||
|
5: (u'пятнадцать',),
|
||||||
|
6: (u'шестнадцать',),
|
||||||
|
7: (u'семнадцать',),
|
||||||
|
8: (u'восемнадцать',),
|
||||||
|
9: (u'девятнадцать',),
|
||||||
|
}
|
||||||
|
|
||||||
|
TWENTIES = {
|
||||||
|
2: (u'двадцать',),
|
||||||
|
3: (u'тридцать',),
|
||||||
|
4: (u'сорок',),
|
||||||
|
5: (u'пятьдесят',),
|
||||||
|
6: (u'шестьдесят',),
|
||||||
|
7: (u'семьдесят',),
|
||||||
|
8: (u'восемьдесят',),
|
||||||
|
9: (u'девяносто',),
|
||||||
|
}
|
||||||
|
|
||||||
|
HUNDREDS = {
|
||||||
|
1: (u'сто',),
|
||||||
|
2: (u'двести',),
|
||||||
|
3: (u'триста',),
|
||||||
|
4: (u'четыреста',),
|
||||||
|
5: (u'пятьсот',),
|
||||||
|
6: (u'шестьсот',),
|
||||||
|
7: (u'семьсот',),
|
||||||
|
8: (u'восемьсот',),
|
||||||
|
9: (u'девятьсот',),
|
||||||
|
}
|
||||||
|
|
||||||
|
THOUSANDS = {
|
||||||
|
1: (u'тысяча', u'тысячи', u'тысяч'), # 10^3
|
||||||
|
2: (u'миллион', u'миллиона', u'миллионов'), # 10^6
|
||||||
|
3: (u'миллиард', u'миллиарда', u'миллиардов'), # 10^9
|
||||||
|
4: (u'триллион', u'триллиона', u'триллионов'), # 10^12
|
||||||
|
5: (u'квадриллион', u'квадриллиона', u'квадриллионов'), # 10^15
|
||||||
|
6: (u'квинтиллион', u'квинтиллиона', u'квинтиллионов'), # 10^18
|
||||||
|
7: (u'секстиллион', u'секстиллиона', u'секстиллионов'), # 10^21
|
||||||
|
8: (u'септиллион', u'септиллиона', u'септиллионов'), # 10^24
|
||||||
|
9: (u'октиллион', u'октиллиона', u'октиллионов'), #10^27
|
||||||
|
10: (u'нониллион', u'нониллиона', u'нониллионов'), # 10^30
|
||||||
|
}
|
||||||
|
|
||||||
|
CURRENCIES = {
|
||||||
|
'RUB': (
|
||||||
|
(u'рубль', u'рубля', u'рублей'), (u'копейка', u'копейки', u'копеек')
|
||||||
|
),
|
||||||
|
'EUR': (
|
||||||
|
(u'евро', u'евро', u'евро'), (u'цент', u'цента', u'центов')
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def splitby3(n):
|
||||||
|
length = len(n)
|
||||||
|
if length > 3:
|
||||||
|
start = length % 3
|
||||||
|
if start > 0:
|
||||||
|
yield int(n[:start])
|
||||||
|
for i in range(start, length, 3):
|
||||||
|
yield int(n[i:i+3])
|
||||||
|
else:
|
||||||
|
yield int(n)
|
||||||
|
|
||||||
|
|
||||||
|
def get_digits(n):
|
||||||
|
return [int(x) for x in reversed(list(('%03d' % n)[-3:]))]
|
||||||
|
|
||||||
|
|
||||||
|
def pluralize(n, forms):
|
||||||
|
if (n % 100 < 10 or n % 100 > 20):
|
||||||
|
if n % 10 == 1:
|
||||||
|
form = 0
|
||||||
|
elif (n % 10 > 1 and n % 10 < 5):
|
||||||
|
form = 1
|
||||||
|
else:
|
||||||
|
form = 2
|
||||||
|
else:
|
||||||
|
form = 2
|
||||||
|
return forms[form]
|
||||||
|
|
||||||
|
|
||||||
|
def int2word(n, feminine=False):
|
||||||
|
if n == 0:
|
||||||
|
return ZERO[0]
|
||||||
|
|
||||||
|
words = []
|
||||||
|
chunks = list(splitby3(str(n)))
|
||||||
|
i = len(chunks)
|
||||||
|
for x in chunks:
|
||||||
|
i -= 1
|
||||||
|
n1, n2, n3 = get_digits(x)
|
||||||
|
|
||||||
|
if n3 > 0:
|
||||||
|
words.append(HUNDREDS[n3][0])
|
||||||
|
|
||||||
|
if n2 > 1:
|
||||||
|
words.append(TWENTIES[n2][0])
|
||||||
|
|
||||||
|
if n2 == 1:
|
||||||
|
words.append(TENS[n1][0])
|
||||||
|
elif n1 > 0 and not (i > 0 and x == 1):
|
||||||
|
ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES
|
||||||
|
words.append(ones[n1][0])
|
||||||
|
|
||||||
|
if i > 0:
|
||||||
|
words.append(pluralize(x, THOUSANDS[i]))
|
||||||
|
|
||||||
|
return ' '.join(words)
|
||||||
|
|
||||||
|
|
||||||
|
def n2w(n):
|
||||||
|
n = str(n).replace(',', '.')
|
||||||
|
if '.' in n:
|
||||||
|
left, right = n.split('.')
|
||||||
|
return u'%s запятая %s' % (int2word(int(left)), int2word(int(right)))
|
||||||
|
else:
|
||||||
|
return int2word(int(n))
|
||||||
|
|
||||||
|
|
||||||
|
def to_currency(n, currency='EUR', cents=True, seperator=','):
|
||||||
|
if type(n) == int:
|
||||||
|
if n < 0:
|
||||||
|
minus = True
|
||||||
|
else:
|
||||||
|
minus = False
|
||||||
|
|
||||||
|
n = abs(n)
|
||||||
|
left = n / 100
|
||||||
|
right = n % 100
|
||||||
|
else:
|
||||||
|
n = str(n).replace(',', '.')
|
||||||
|
if '.' in n:
|
||||||
|
left, right = n.split('.')
|
||||||
|
else:
|
||||||
|
left, right = n, 0
|
||||||
|
left, right = int(left), int(right)
|
||||||
|
minus = False
|
||||||
|
cr1, cr2 = CURRENCIES[currency]
|
||||||
|
|
||||||
|
if minus:
|
||||||
|
minus_str = "минус "
|
||||||
|
else:
|
||||||
|
minus_str = ""
|
||||||
|
|
||||||
|
if cents:
|
||||||
|
cents_feminine = currency == 'RUB'
|
||||||
|
cents_str = int2word(right, cents_feminine)
|
||||||
|
else:
|
||||||
|
cents_str = "%02d" % right
|
||||||
|
|
||||||
|
return u'%s%s %s%s %s %s' % (
|
||||||
|
minus_str,
|
||||||
|
int2word(left),
|
||||||
|
pluralize(left, cr1),
|
||||||
|
seperator,
|
||||||
|
cents_str,
|
||||||
|
pluralize(right, cr2)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Num2Word_RU(object):
|
||||||
|
def to_cardinal(self, number):
|
||||||
|
return n2w(number)
|
||||||
|
|
||||||
|
def to_ordinal(self, number):
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import doctest
|
||||||
|
doctest.testmod()
|
||||||
Reference in New Issue
Block a user