mirror of
https://github.com/bblaz/num2words.git
synced 2025-12-06 06:42:25 +00:00
[IMP] Improve convert number method and add unittest for Vietnam lang
This commit is contained in:
@@ -34,7 +34,6 @@ denom = ('',
|
|||||||
|
|
||||||
class Num2Word_VN(object):
|
class Num2Word_VN(object):
|
||||||
|
|
||||||
# convert a value < 100 to English.
|
|
||||||
def _convert_nn(self, val):
|
def _convert_nn(self, val):
|
||||||
if val < 20:
|
if val < 20:
|
||||||
return to_19[val]
|
return to_19[val]
|
||||||
@@ -46,6 +45,8 @@ class Num2Word_VN(object):
|
|||||||
a = u'mốt'
|
a = u'mốt'
|
||||||
else:
|
else:
|
||||||
a = to_19[val % 10]
|
a = to_19[val % 10]
|
||||||
|
if to_19[val % 10] == u'năm':
|
||||||
|
a = u'lăm'
|
||||||
return dcap + ' ' + a
|
return dcap + ' ' + a
|
||||||
return dcap
|
return dcap
|
||||||
|
|
||||||
@@ -56,7 +57,13 @@ class Num2Word_VN(object):
|
|||||||
word = to_19[rem] + u' trăm'
|
word = to_19[rem] + u' trăm'
|
||||||
if mod > 0:
|
if mod > 0:
|
||||||
word = word + ' '
|
word = word + ' '
|
||||||
if mod > 0:
|
if mod > 0 and mod < 10:
|
||||||
|
if mod == 5:
|
||||||
|
word = word != '' and word + u'lẻ năm' or word + u'năm'
|
||||||
|
else:
|
||||||
|
word = word != '' and word + u'lẻ ' \
|
||||||
|
+ self._convert_nn(mod) or word + self._convert_nn(mod)
|
||||||
|
if mod >= 10:
|
||||||
word = word + self._convert_nn(mod)
|
word = word + self._convert_nn(mod)
|
||||||
return word
|
return word
|
||||||
|
|
||||||
@@ -70,7 +77,10 @@ class Num2Word_VN(object):
|
|||||||
mod = 1000 ** didx
|
mod = 1000 ** didx
|
||||||
l = val // mod
|
l = val // mod
|
||||||
r = val - (l * mod)
|
r = val - (l * mod)
|
||||||
ret = self._convert_nnn(l) + ' ' + denom[didx]
|
|
||||||
|
ret = self._convert_nnn(l) + u' ' + denom[didx]
|
||||||
|
if r > 0 and r <= 99:
|
||||||
|
ret = self._convert_nnn(l) + u' ' + denom[didx] + u' lẻ'
|
||||||
if r > 0:
|
if r > 0:
|
||||||
ret = ret + ' ' + self.vietnam_number(r)
|
ret = ret + ' ' + self.vietnam_number(r)
|
||||||
return ret
|
return ret
|
||||||
|
|||||||
106
tests/test_vn.py
Normal file
106
tests/test_vn.py
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
# Copyright (c) 2015, 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
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
from unittest import TestCase
|
||||||
|
from num2words import num2words
|
||||||
|
|
||||||
|
class Num2WordsVNTest(TestCase):
|
||||||
|
|
||||||
|
|
||||||
|
def test_0(self):
|
||||||
|
self.assertEqual(num2words(0, lang="vi_VN"), "không")
|
||||||
|
|
||||||
|
def test_1_to_10(self):
|
||||||
|
self.assertEqual(num2words(1, lang="vi_VN"), "một")
|
||||||
|
self.assertEqual(num2words(2, lang="vi_VN"), "hai")
|
||||||
|
self.assertEqual(num2words(7, lang="vi_VN"), "bảy")
|
||||||
|
self.assertEqual(num2words(10, lang="vi_VN"), "mười")
|
||||||
|
|
||||||
|
def test_11_to_19(self):
|
||||||
|
self.assertEqual(num2words(11, lang="vi_VN"), "mười một")
|
||||||
|
self.assertEqual(num2words(13, lang="vi_VN"), "mười ba")
|
||||||
|
self.assertEqual(num2words(14, lang="vi_VN"), "mười bốn")
|
||||||
|
self.assertEqual(num2words(15, lang="vi_VN"), "mười lăm")
|
||||||
|
self.assertEqual(num2words(16, lang="vi_VN"), "mười sáu")
|
||||||
|
self.assertEqual(num2words(19, lang="vi_VN"), "mười chín")
|
||||||
|
|
||||||
|
def test_20_to_99(self):
|
||||||
|
self.assertEqual(num2words(20, lang="vi_VN"), "hai mươi")
|
||||||
|
self.assertEqual(num2words(23, lang="vi_VN"), "hai mươi ba")
|
||||||
|
self.assertEqual(num2words(28, lang="vi_VN"), "hai mươi tám")
|
||||||
|
self.assertEqual(num2words(31, lang="vi_VN"), "ba mươi mốt")
|
||||||
|
self.assertEqual(num2words(40, lang="vi_VN"), "bốn mươi")
|
||||||
|
self.assertEqual(num2words(66, lang="vi_VN"), "sáu mươi sáu")
|
||||||
|
self.assertEqual(num2words(92, lang="vi_VN"), "chín mươi hai")
|
||||||
|
|
||||||
|
def test_100_to_999(self):
|
||||||
|
self.assertEqual(num2words(100, lang="vi_VN"), "một trăm")
|
||||||
|
self.assertEqual(num2words(150, lang="vi_VN"), "một trăm năm mươi")
|
||||||
|
self.assertEqual(num2words(196, lang="vi_VN"), "một trăm chín mươi sáu")
|
||||||
|
self.assertEqual(num2words(200, lang="vi_VN"), "hai trăm")
|
||||||
|
self.assertEqual(num2words(210, lang="vi_VN"), "hai trăm mười")
|
||||||
|
|
||||||
|
def test_1000_to_9999(self):
|
||||||
|
self.assertEqual(num2words(1000, lang="vi_VN"), "một nghìn")
|
||||||
|
self.assertEqual(num2words(1500, lang="vi_VN"), "một nghìn năm trăm")
|
||||||
|
self.assertEqual(num2words(7378, lang="vi_VN"), "bảy nghìn ba trăm bảy mươi tám")
|
||||||
|
self.assertEqual(num2words(2000, lang="vi_VN"), "hai nghìn")
|
||||||
|
self.assertEqual(num2words(2100, lang="vi_VN"), "hai nghìn một trăm")
|
||||||
|
self.assertEqual(num2words(6870, lang="vi_VN"), "sáu nghìn tám trăm bảy mươi")
|
||||||
|
self.assertEqual(num2words(10000, lang="vi_VN"), "mười nghìn")
|
||||||
|
self.assertEqual(num2words(100000, lang="vi_VN"), "một trăm nghìn")
|
||||||
|
self.assertEqual(num2words(523456, lang="vi_VN"), "năm trăm hai mươi ba nghìn bốn trăm năm mươi sáu")
|
||||||
|
|
||||||
|
def test_big(self):
|
||||||
|
self.assertEqual(num2words(1000000, lang="vi_VN"), "một triệu")
|
||||||
|
self.assertEqual(num2words(1200000, lang="vi_VN"), "một triệu hai trăm nghìn")
|
||||||
|
self.assertEqual(num2words(3000000, lang="vi_VN"), "ba triệu")
|
||||||
|
self.assertEqual(num2words(3800000, lang="vi_VN"), "ba triệu tám trăm nghìn")
|
||||||
|
self.assertEqual(num2words(1000000000, lang="vi_VN"), "một tỷ")
|
||||||
|
self.assertEqual(num2words(2000000000, lang="vi_VN"), "hai tỷ")
|
||||||
|
self.assertEqual(num2words(2000001000, lang="vi_VN"), "hai tỷ một nghìn")
|
||||||
|
self.assertEqual(num2words(1234567890, lang="vi_VN"), "một tỷ hai trăm ba mươi bốn triệu năm trăm sáu mươi bảy nghìn tám trăm chín mươi")
|
||||||
|
|
||||||
|
|
||||||
|
def test_decimal_number(self):
|
||||||
|
self.assertEqual(num2words(1000.11, lang="vi_VN"), "một nghìn phẩy mười một")
|
||||||
|
self.assertEqual(num2words(1000.21, lang="vi_VN"), "một nghìn phẩy hai mươi mốt")
|
||||||
|
|
||||||
|
def test_special_number(self):
|
||||||
|
"""
|
||||||
|
Some number will have some specail rule
|
||||||
|
"""
|
||||||
|
self.assertEqual(num2words(21, lang="vi_VN"), "hai mươi mốt")
|
||||||
|
self.assertEqual(num2words(25, lang="vi_VN"), "hai mươi lăm")
|
||||||
|
# >100
|
||||||
|
self.assertEqual(num2words(101, lang="vi_VN"), "một trăm lẻ một")
|
||||||
|
self.assertEqual(num2words(105, lang="vi_VN"), "một trăm lẻ năm")
|
||||||
|
self.assertEqual(num2words(701, lang="vi_VN"), "bảy trăm lẻ một")
|
||||||
|
self.assertEqual(num2words(705, lang="vi_VN"), "bảy trăm lẻ năm")
|
||||||
|
|
||||||
|
# >1000
|
||||||
|
self.assertEqual(num2words(1001, lang="vi_VN"), "một nghìn lẻ một")
|
||||||
|
self.assertEqual(num2words(1005, lang="vi_VN"), "một nghìn lẻ năm")
|
||||||
|
self.assertEqual(num2words(98765, lang="vi_VN"), "chín mươi tám nghìn bảy trăm sáu mươi lăm")
|
||||||
|
|
||||||
|
# > 1000000
|
||||||
|
self.assertEqual(num2words(3000005, lang="vi_VN"), "ba triệu lẻ năm")
|
||||||
|
self.assertEqual(num2words(1000007, lang="vi_VN"), "một triệu lẻ bảy")
|
||||||
|
|
||||||
|
# > 1000000000
|
||||||
|
self.assertEqual(num2words(1000000017, lang="vi_VN"), "một tỷ lẻ mười bảy")
|
||||||
|
self.assertEqual(num2words(1000101017, lang="vi_VN"), "một tỷ một trăm lẻ một nghìn lẻ mười bảy")
|
||||||
Reference in New Issue
Block a user