decimal field: parse using locale + pattern using zope.i18n

This commit is contained in:
Helmut Merz 2025-05-15 19:54:21 +02:00
parent dc5e1fa251
commit 350a600ffc

View file

@ -4,17 +4,15 @@
""" """
from datetime import datetime from datetime import datetime
import locale
from logging import getLogger from logging import getLogger
from time import strptime, strftime from time import strptime, strftime
from zope.browser.interfaces import ITerms from zope.browser.interfaces import ITerms
from zope.i18n.format import DateTimeParseError
from zope.i18n.locales import locales from zope.i18n.locales import locales
from zope.interface import implementer from zope.interface import implementer
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.component import adapts from zope.component import adapts
from zope import component from zope import component
from zope.i18n.format import DateTimeParseError
from zope.i18n.locales import locales
from zope.schema.interfaces import IVocabularyFactory, IContextSourceBinder from zope.schema.interfaces import IVocabularyFactory, IContextSourceBinder
from zope.tales.engine import Engine from zope.tales.engine import Engine
from zope.tales.tales import Context from zope.tales.tales import Context
@ -264,9 +262,9 @@ class DecimalFieldInstance(NumberFieldInstance):
format = 'decimal' format = 'decimal'
def marshall(self, value): def marshall(self, value):
return self.display(value, pattern=u'0.00;-0.00') return self.display(value, pattern='0.00;-0.00')
def display(self, value, pattern=u'#,##0.00;-#,##0.00'): def display(self, value, pattern='#,##0.00;-#,##0.00'):
if value is None: if value is None:
return '' return ''
if isinstance(value, str): if isinstance(value, str):
@ -281,14 +279,15 @@ class DecimalFieldInstance(NumberFieldInstance):
return fmt.format(value, pattern=pattern) return fmt.format(value, pattern=pattern)
return '%.2f' % value return '%.2f' % value
def unmarshall(self, value): def unmarshall(self, value, pattern='#,##0.00;-#,##0.00'):
if not value: if not value:
return None return None
view = self.clientInstance.view view = self.clientInstance.view
langInfo = view and getattr(view, 'languageInfo', None) or None langInfo = view and getattr(view, 'languageInfo', None) or None
if langInfo and langInfo.language == 'de': if langInfo:
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') locale = locales.getLocale(langInfo.language)
return locale.atof(value) fmt = locale.numbers.getFormatter(self.format)
return fmt.parse(value, pattern=pattern)
if ',' in value: if ',' in value:
value = value.replace(',', '.') value = value.replace(',', '.')
return float(value) return float(value)