0

Я использую механизм приложений 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 долларов за галлон» - это цена, которую я не могу обработать, но она может быть указана в тексте вместо этого, поскольку это особый тип цены (на единицу объема), а также, если цена в центах. Хранение цены как целочисленного свойства позволит значительно улучшить форматирование цен, поскольку мое приложение интернационализируется и локализуется.

Спасибо за любой ответ или комментарий

+0

Если вы хотите использовать 'decimal', вы можете включить его в свой код и просто изменить свои десятичные объекты на str. Если у вас есть десятичное значение в вашей родной среде, при импорте путь в 'decimal .__ file__' будет содержать исходный источник (или скомпилированный источник). Вы можете просто скопировать его в каталог вашего приложения. (Я пытаюсь найти источник десятичного числа в Интернете). – bossylobster

ответ

1

Пожалуйста, посмотрите на номер выпуска 6595, а также this. Если ваша проблема кроется в этой области, она может быть решена с помощью патча, который я бы предложил захватить область в исключающем блоке и выгрузить переменную esp для индивидуального порядкового номера, чтобы убедиться, что передано в Decimal является допустимым допустимым символом , Для меня это выглядит странно, что персонаж, которого он жалуется, является пустой строкой, поэтому давайте попробуем подтвердить, что все символы действительны, поскольку мы имеем дело с unicode здесь.

 Смежные вопросы

  • Нет связанных вопросов^_^