Я использую механизм приложений Google (python) и Jinja2, и я хотел бы воспользоваться функцией webapp2 для интернационализации и локализации валют, т.е. хранить цены как число и делать правильное форматирование с использованием встроенный метод i18n для webapp2. Тогда сначала у меня должен быть правильный тип данных для моих цен.Обработка чисел, которые являются ценами с GAE + WTForms
Я перехожу от прототипа, который использовал String для цен в более реальной реализации, где я использую некоторый тип данных данных для цен + другую переменную, в которой она есть. Таким образом, в процессе миграции я буду использовать обе переменные, сделать переход на использование чисел, инсталлированных по строкам, удалить строковый тип данных и сделать задание mapreduce для обновления старых объектов до числовой переменной, такой как целочисленная или десятичная, вместо того, чтобы разрешить text/a строка для представления цены.
Мое окружение (движок Google) не поддерживает десятичный тип данных, и я мог бы также использовать целые числа только потому, что использование покупает и продает более экзотические предметы и предметы, такие как дома, автомобили и т. Д., Где доллары имеют значение и центы обычно перечисляются только как 00. Таким образом, я отбросил проект реализации десятичного свойства, и он все равно прослушивался, и теперь я спрашиваю, какой правильный способ установить цену, и должен ли я использовать ее до ее сохранения?
Т.е. это правильно:
form = EntityForm(self.request.params)
if form.validate():
entity.title = form.title.data
entity.name = form.name.data
entity.email = form.email.data
entity.text = form.text.data
entity.set_password(form.password.data)
entity.price = form.price.data
try:
if form.price.data:
form.price.data=form.price.data.replace(',','.').replace(' ', '')
entity.integer_price = int(form.price.data)
except:
pass
Или я не должен привести переменный в целом и типа преобразования будет заботиться о за кулисами? Я считаю, что переменные формы являются строками, а цена должна быть числом, чтобы сортировать и фильтровать правильно.
Когда я использую I специально сделанный десятичное свойство я начал получать эту ошибку:
Traceback (most recent call last):
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/base/data/home/apps/s~montaoproject/validation.355292363398040911/i18n.py", line 653, in get
ads = paginator.page(page)
File "/base/data/home/apps/s~montaoproject/validation.355292363398040911/paginator.py", line 42, in page
return Page(self.object_list[bottom:top], number, self)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2189, in __getitem__
return self.fetch(limit, start)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2084, in fetch
return list(self.run(limit=limit, offset=offset, **kwargs))
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2237, in next
return self.__model_class.from_entity(self.__iterator.next())
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/search/__init__.py", line 463, in from_entity
return super(SearchableModel, cls).from_entity(entity)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 1411, in from_entity
entity_values = cls._load_entity_values(entity)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 1387, in _load_entity_values
value = prop.make_value_from_datastore(entity[prop.name])
File "/base/data/home/apps/s~montaoproject/validation.355292363398040911/main.py", line 98, in make_value_from_datastore
return decimal.Decimal(value)
File "/base/python27_runtime/python27_dist/lib/python2.7/decimal.py", line 548, in __new__
"Invalid literal for Decimal: %r" % value)
File "/base/python27_runtime/python27_dist/lib/python2.7/decimal.py", line 3844, in _raise_error
raise error(explanation)
InvalidOperation: Invalid literal for Decimal: u''
кода я использую был:
class DecimalProperty(db.Property):
data_type = decimal.Decimal
def get_value_for_datastore(self, model_instance):
return str(super(DecimalProperty, self).get_value_for_datastore(model_instance))
def make_value_from_datastore(self, value):
return decimal.Decimal(value)
def validate(self, value):
value = super(DecimalProperty, self).validate(value)
if value is None or isinstance(value, decimal.Decimal):
return value
elif isinstance(value, basestring):
return decimal.Decimal(value)
raise db.BadValueError("Property %s must be a Decimal or string." % self.name)
Но это не работает для меня, Я начал получать слово «Нет» как строку для статей/объектов, у которых не было никакой цены, из-за чего приложение не загружалось должным образом, поэтому я полностью удалил десятичную попытку, и вместо этого вернусь к решению с integerproperty, пустой или целое число, которое я могу сделать с помощью wtforms.
Таким образом, я не использую пользовательский десятичный знак, и мы решили, что integerproperty будет делать и худший случай, если требуется доля валюты, тогда a может использовать другую переменную «cents», чтобы я использовал целые числа для долларов и целых чисел для центы, а последние редко или никогда не используются.
Так что решение я планирую сейчас просто:
класс Статья (Geomodel, search.SearchableModel):
integer_price = IntegerProperty() #store dollars as dollars
currency = db.StringProperty(choices=(
'EUR',
'ARS',
'AUD',
'BRL',
'GBP',
'CAD',
'CZK',
'DKK',
'HKD',
'HUF',
'ILS',
'INR',
'JPY',
'MXN',
'NZD',
'NOK',
'PLN',
'PHP',
'SGD',
'SEK',
'SGD',
'CHF',
'USD',
'THB',
'TWB',
), verbose_name='Currency')
price = db.StringProperty(verbose_name='price') #quit using this and use a number instead
Знаете ли вы, если я на самом деле нужно сделать преобразование типа или любой другой я могу упасть? Вы согласны с тем, что мне не нужны десятичные знаки для моего случая использования (реклама автомобиля, реклама дома) и т. Д., Хотя это возможно с более экзотическим ценообразованием, которое я должен запретить, например. «20 долларов за галлон» - это цена, которую я не могу обработать, но она может быть указана в тексте вместо этого, поскольку это особый тип цены (на единицу объема), а также, если цена в центах. Хранение цены как целочисленного свойства позволит значительно улучшить форматирование цен, поскольку мое приложение интернационализируется и локализуется.
Спасибо за любой ответ или комментарий
Если вы хотите использовать 'decimal', вы можете включить его в свой код и просто изменить свои десятичные объекты на str. Если у вас есть десятичное значение в вашей родной среде, при импорте путь в 'decimal .__ file__' будет содержать исходный источник (или скомпилированный источник). Вы можете просто скопировать его в каталог вашего приложения. (Я пытаюсь найти источник десятичного числа в Интернете). – bossylobster