From 886b38a83bfa5181478a7e00a4ef0dda3f218c9a Mon Sep 17 00:00:00 2001 From: Evaldo Junior Date: Tue, 27 Oct 2015 19:58:12 +0100 Subject: [PATCH] Working in the locale fix. --- requirements-development.txt | 1 + rows/fields.py | 8 ++++++-- tests/tests_fields.py | 31 ++++++++++++++++++------------- tests/tests_localization.py | 5 ++++- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/requirements-development.txt b/requirements-development.txt index 14797609..70c6d264 100644 --- a/requirements-development.txt +++ b/requirements-development.txt @@ -6,6 +6,7 @@ requests lxml xlrd xlwt +openpyxl # Test tools coverage diff --git a/rows/fields.py b/rows/fields.py index 089a1e90..0ffc4084 100644 --- a/rows/fields.py +++ b/rows/fields.py @@ -23,6 +23,8 @@ import re import types +from locale import localeconv + from decimal import Decimal, InvalidOperation @@ -33,6 +35,8 @@ REGEXP_ONLY_NUMBERS = re.compile('[^0-9]') SHOULD_NOT_USE_LOCALE = True # This variable is changed by rows.locale_manager NULL = (b'-', b'null', b'none', b'nil', b'n/a', b'na') +DP = localeconv()['decimal_point'] +TS = localeconv()['thousands_sep'] class Field(object): @@ -213,11 +217,11 @@ def serialize(cls, value, *args, **kwargs): return value_as_string else: grouping = kwargs.get('grouping', None) - has_decimal_places = value_as_string.find('.') != -1 + has_decimal_places = value_as_string.find(DP) != -1 if not has_decimal_places: string_format = '%d' else: - decimal_places = len(value_as_string.split('.')[1]) + decimal_places = len(value_as_string.split(DP)[1]) string_format = '%.{}f'.format(decimal_places) return locale.format(string_format, value, grouping=grouping) diff --git a/tests/tests_fields.py b/tests/tests_fields.py index b01dabf9..d0102368 100644 --- a/tests/tests_fields.py +++ b/tests/tests_fields.py @@ -23,6 +23,7 @@ import types from decimal import Decimal +from locale import getdefaultlocale, localeconv import rows import platform @@ -32,7 +33,11 @@ if platform.system() == 'Windows': locale_name = str('ptb_bra') else: - locale_name = 'pt_BR.UTF-8' + defaultlocale = getdefaultlocale() + locale_name = '{}.{}'.format(defaultlocale[0], defaultlocale[1]) + +dp = localeconv()['decimal_point'] +ts = localeconv()['thousands_sep'] class FieldsTestCase(unittest.TestCase): @@ -107,7 +112,7 @@ def test_IntegerField(self): types.UnicodeType) self.assertEqual(fields.IntegerField.serialize(42000, grouping=True), - '42.000') + '42{}000'.format(ts)) self.assertEqual(fields.IntegerField.deserialize('42.000'), 42000) self.assertEqual(fields.IntegerField.deserialize(42), 42) self.assertEqual(fields.IntegerField.deserialize(42.0), 42) @@ -126,7 +131,7 @@ def test_FloatField(self): self.assertEqual(fields.FloatField.deserialize(42.0), 42.0) self.assertEqual(fields.FloatField.deserialize(42), 42.0) self.assertEqual(fields.FloatField.deserialize(None), None) - self.assertEqual(fields.FloatField.serialize(42.0), '42.0') + self.assertEqual(fields.FloatField.serialize(42.0), '42{}0'.format(dp)) self.assertIs(type(fields.FloatField.serialize(42.0)), types.UnicodeType) @@ -169,18 +174,18 @@ def test_DecimalField(self): ) self.assertEqual(fields.DecimalField.serialize(Decimal('4200')), '4200') - self.assertEqual(fields.DecimalField.serialize(Decimal('42.0')), - '42,0') - self.assertEqual(fields.DecimalField.serialize(Decimal('42000.0')), - '42000,0') - self.assertEqual(fields.DecimalField.deserialize('42.000,00'), - Decimal('42000.00')) + self.assertEqual(fields.DecimalField.serialize(Decimal('42{}0'.format(ts))), + '42{}0'.format(ts)) + self.assertEqual(fields.DecimalField.serialize(Decimal('42000{}0'.format(dp))), + '42000{}0'.format(dp)) + self.assertEqual(fields.DecimalField.deserialize('42{}000{}00'.format(ts, dp)), + Decimal('42000{}00'.format(dp))) self.assertEqual( fields.DecimalField.serialize( - Decimal('42000.0'), + Decimal('42000{}0'.format(dp)), grouping=True ), - '42.000,0' + '42{}000{}0'.format(ts, dp) ) self.assertEqual(fields.DecimalField.deserialize(42000), Decimal('42000')) @@ -215,8 +220,8 @@ def test_PercentField(self): '4200%') self.assertEqual(fields.PercentField.serialize(Decimal('42000.0')), '4200000%') - self.assertEqual(fields.PercentField.deserialize('42.000,00%'), - Decimal('420.0000')) + self.assertEqual(fields.PercentField.deserialize('42{}000{}00%'.format(ts, dp)), + Decimal('420{}0000'.format(ts))) self.assertEqual(fields.PercentField.serialize(Decimal('42000.00'), grouping=True), '4.200.000%') diff --git a/tests/tests_localization.py b/tests/tests_localization.py index f7a5923b..ae51851f 100644 --- a/tests/tests_localization.py +++ b/tests/tests_localization.py @@ -20,6 +20,8 @@ import unittest import platform +from locale import getdefaultlocale + import rows import rows.fields @@ -37,7 +39,8 @@ def test_locale_context(self): if platform.system() == 'Windows': name = str('ptb_bra') else: - name = 'pt_BR.UTF-8' + defaultlocale = getdefaultlocale() + name = '{}.{}'.format(defaultlocale[0], defaultlocale[1]) with locale_context(name): self.assertFalse(rows.fields.SHOULD_NOT_USE_LOCALE) self.assertTrue(rows.fields.SHOULD_NOT_USE_LOCALE)