lang_VI.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. to_19 = (u'không', u'một', u'hai', u'ba', u'bốn', u'năm', u'sáu',
  4. u'bảy', u'tám', u'chín', u'mười', u'mười một', u'mười hai',
  5. u'mười ba', u'mười bốn', u'mười lăm', u'mười sáu', u'mười bảy',
  6. u'mười tám', u'mười chín')
  7. tens = (u'hai mươi', u'ba mươi', u'bốn mươi', u'năm mươi',
  8. u'sáu mươi', u'bảy mươi', u'tám mươi', u'chín mươi')
  9. denom = ('',
  10. u'nghìn', u'triệu', u'tỷ', u'nghìn tỷ', u'trăm nghìn tỷ',
  11. 'Quintillion', 'Sextillion', 'Septillion', 'Octillion', 'Nonillion',
  12. 'Decillion', 'Undecillion', 'Duodecillion', 'Tredecillion',
  13. 'Quattuordecillion', 'Sexdecillion', 'Septendecillion',
  14. 'Octodecillion', 'Novemdecillion', 'Vigintillion')
  15. class Num2Word_VI(object):
  16. def _convert_nn(self, val):
  17. if val < 20:
  18. return to_19[val]
  19. for (dcap, dval) in ((k, 20 + (10 * v)) for (v, k) in enumerate(tens)):
  20. if dval + 10 > val:
  21. if val % 10:
  22. a = u'lăm'
  23. if to_19[val % 10] == u'một':
  24. a = u'mốt'
  25. else:
  26. a = to_19[val % 10]
  27. if to_19[val % 10] == u'năm':
  28. a = u'lăm'
  29. return dcap + ' ' + a
  30. return dcap
  31. def _convert_nnn(self, val):
  32. word = ''
  33. (mod, rem) = (val % 100, val // 100)
  34. if rem > 0:
  35. word = to_19[rem] + u' trăm'
  36. if mod > 0:
  37. word = word + ' '
  38. if mod > 0 and mod < 10:
  39. if mod == 5:
  40. word = word != '' and word + u'lẻ năm' or word + u'năm'
  41. else:
  42. word = word != '' and word + u'lẻ ' \
  43. + self._convert_nn(mod) or word + self._convert_nn(mod)
  44. if mod >= 10:
  45. word = word + self._convert_nn(mod)
  46. return word
  47. def vietnam_number(self, val):
  48. if val < 100:
  49. return self._convert_nn(val)
  50. if val < 1000:
  51. return self._convert_nnn(val)
  52. for (didx, dval) in ((v - 1, 1000 ** v) for v in range(len(denom))):
  53. if dval > val:
  54. mod = 1000 ** didx
  55. lval = val // mod
  56. r = val - (lval * mod)
  57. ret = self._convert_nnn(lval) + u' ' + denom[didx]
  58. if 99 >= r > 0:
  59. ret = self._convert_nnn(lval) + u' ' + denom[didx] + u' lẻ'
  60. if r > 0:
  61. ret = ret + ' ' + self.vietnam_number(r)
  62. return ret
  63. def number_to_text(self, number):
  64. number = '%.2f' % number
  65. the_list = str(number).split('.')
  66. start_word = self.vietnam_number(int(the_list[0]))
  67. final_result = start_word
  68. if len(the_list) > 1 and int(the_list[1]) > 0:
  69. end_word = self.vietnam_number(int(the_list[1]))
  70. final_result = final_result + ' phẩy ' + end_word
  71. return final_result
  72. def to_cardinal(self, number):
  73. return self.number_to_text(number)
  74. def to_ordinal(self, number):
  75. return self.to_cardinal(number)