[FIX] lang_LT, lang_LV: negative amounts (#185)

Negative amounts were not working (when no currency is used), because
`get_digits` method does not expect `-` sign, which crashes conversion.
To avoid that, we split minus sign from number string and prepare its
word to be used with amount words.

closes: #184
This commit is contained in:
Andrius Laukavičius
2018-08-23 17:39:03 +03:00
committed by Istvan SZALAÏ
parent 1ca8225ea6
commit 39f522f34a
5 changed files with 33 additions and 4 deletions

View File

@@ -89,6 +89,13 @@ class Num2Word_Base(object):
return out return out
def parse_minus(self, num_str):
"""Detach minus and return it as symbol with new num_str."""
if num_str.startswith('-'):
# Extra spacing to compensate if there is no minus.
return '%s ' % self.negword, num_str[1:]
return '', num_str
def to_cardinal(self, value): def to_cardinal(self, value):
try: try:
assert int(value) == value assert int(value) == value

View File

@@ -14,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
# TODO: replace WINDOWS line endings to UNIX?
from __future__ import unicode_literals from __future__ import unicode_literals
from .base import Num2Word_Base from .base import Num2Word_Base
@@ -98,15 +99,17 @@ class Num2Word_LT(Num2Word_Base):
def to_cardinal(self, number): def to_cardinal(self, number):
n = str(number).replace(',', '.') n = str(number).replace(',', '.')
base_str, n = self.parse_minus(n)
if '.' in n: if '.' in n:
left, right = n.split('.') left, right = n.split('.')
return '%s %s %s' % ( return '%s%s %s %s' % (
base_str,
self._int2word(int(left)), self._int2word(int(left)),
self.pointword, self.pointword,
self._int2word(int(right)) self._int2word(int(right))
) )
else: else:
return self._int2word(int(n)) return "%s%s" % (base_str, self._int2word(int(n)))
def to_ordinal(self, number): def to_ordinal(self, number):
raise NotImplementedError() raise NotImplementedError()

View File

@@ -14,6 +14,7 @@
# License along with this library; if not, write to the Free Software # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA # MA 02110-1301 USA
# TODO: replace WINDOWS line endings to UNIX?
from __future__ import unicode_literals from __future__ import unicode_literals
from .base import Num2Word_Base from .base import Num2Word_Base
@@ -132,15 +133,17 @@ class Num2Word_LV(Num2Word_Base):
def to_cardinal(self, number): def to_cardinal(self, number):
n = str(number).replace(',', '.') n = str(number).replace(',', '.')
base_str, n = self.parse_minus(n)
if '.' in n: if '.' in n:
left, right = n.split('.') left, right = n.split('.')
return u'%s %s %s' % ( return '%s%s %s %s' % (
base_str,
self._int2word(int(left)), self._int2word(int(left)),
self.pointword, self.pointword,
self._int2word(int(right)) self._int2word(int(right))
) )
else: else:
return self._int2word(int(n)) return "%s%s" % (base_str, self._int2word(int(n)))
def pluralize(self, n, forms): def pluralize(self, n, forms):
form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2 form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2

View File

@@ -44,6 +44,14 @@ class Num2WordsLTTest(TestCase):
"aštuoni šimtai dvidešimt du trilijonai aštuoni šimtai dvidešimt " "aštuoni šimtai dvidešimt du trilijonai aštuoni šimtai dvidešimt "
"keturi milijardai trys šimtai aštuoniasdešimt keturi milijonai " "keturi milijardai trys šimtai aštuoniasdešimt keturi milijonai "
"du šimtai dvidešimt tūkstančių du šimtai devyniasdešimt vienas") "du šimtai dvidešimt tūkstančių du šimtai devyniasdešimt vienas")
self.assertEqual(
num2words(-5000, lang='lt'),
'minus penki tūkstančiai',
)
self.assertEqual(
num2words(-5000.22, lang='lt'),
'minus penki tūkstančiai kablelis dvidešimt du',
)
# print(fill(n2w(1000000000000000000000000000000))) # print(fill(n2w(1000000000000000000000000000000)))
# naintilijonas # naintilijonas

View File

@@ -39,6 +39,14 @@ class Num2WordsLVTest(TestCase):
'divdesmit divi triljoni astoņi simti divdesmit četri ' 'divdesmit divi triljoni astoņi simti divdesmit četri '
'miljardi trīs simti astoņdesmit četri miljoni divi simti ' 'miljardi trīs simti astoņdesmit četri miljoni divi simti '
'divdesmit tūkstoši divi simti deviņdesmit viens') 'divdesmit tūkstoši divi simti deviņdesmit viens')
self.assertEqual(
num2words(-5000, lang='lv'),
'mīnus pieci tūkstoši',
)
self.assertEqual(
num2words(-5000.22, lang='lv'),
'mīnus pieci tūkstoši komats divdesmit divi',
)
# >>> print(fill(n2w(1000000000000000000000000000000))) # >>> print(fill(n2w(1000000000000000000000000000000)))
# nontiljons # nontiljons