2016-09-14 1 views
0

В моем приложении Django 1.7.11 я получаю данные, отформатированные с помощью испанского языка через HTTP. Таким образом, на мой взгляд, я получаю строку Юникода, представляющую десятичное число в испанской местности:Преобразовать строку unicode, ориентированную на язык, в действительном десятичном числе в Python/Django

spanish_number = request.GET.get('some_post_value', 0) 
# spanish_number may be u'12,542' now, for example. And may come via POST. This is not important. Just the value itself is important: it contains commas as decimal separator. 

И я хочу, чтобы сохранить, что в поле Django модели типа DecimalField:

class MyModel(models.Model): 
    my_number = models.DecimalField(max_digits=10, decimal_places=3, null=True, blank=True) 

В моей settings.py, у меня есть

USE_L10N=True 
USE_I18N=True 

Если я пытаюсь что-то вроде

m = MyModel() 
m.my_number = spanish_number # This is, u'12,542' 
m.save() 

Это терпит неудачу с ValidationError, потому что

u'12,542' must be a decimal number 

Что бы правильный путь, чтобы справиться с этим? Я имею в виду, с тем, что мое приложение будет получать номера (и даты ...) отформатирован этот путь (испанский локали)

PS: Я знаю, Django имеет DecimalField для форм, с локализуют = Истинный вариант, но я напрямую имею дело с Модели, а не с Формами.

ответ

1

Вы на правильном пути, глядя на форму DecimalField. Если вы проверите его источник, вы увидите, что при установке для локализации он запускает строку через formats.sanitize_separators. Вы можете называть это напрямую, чтобы преобразовать в формат Decimal() ожидает:

import django.utils.formats 
m.my_number = formats.sanitize_separators(spanish_number) 
+0

Пробовал, что. Не работает. Но я отлаживал код sanitize_separator и читал о настройках. Похоже, что настройки, такие как USE_L10N, USE_THOUSAND_SEPARATOR и т. Д., Используются для определения способа отображения номеров Django. Не говорит ничего о том, как сделать противоположную поездку (хранить локализованные данные). Или я не могу его найти. – jorgeas80

+0

Хм. Похоже, эта функция требует 'USE_THOUSAND_SEPARATOR'' 'True' для обработки тысяч. Вы можете установить это значение «Истина», если хотите, чтобы локализованный разделитель тысяч использовался в других контекстах, переопределите функцию санитарии самостоятельно таким образом, чтобы она не зависела от нее, или сделать уродливый взлом модификации «settings.USE_THOUSAND_SEPARATOR» до и после дезинфекции. –

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