在Python / Django中以有效的十进制数转换语言环境感知的unicode字符串

时间:2016-09-14 17:05:44

标签: python django unicode localization

在我的 Django 1.7.11 应用程序中,我通过HTTP获取使用西班牙语语言环境格式化的数据。因此,在我看来,我得到一个代表西班牙语语言环境中十进制数字的unicode字符串:

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.

我希望将它存储在DecimalField类型的Django Model&#fs字段中:

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

处理这个问题的正确方法是什么?我的意思是,事实上我的应用程序将以这种方式接收数字(和日期...)(西班牙语)区域)

P.S。:我知道Django有一个DecimalField表格,有一个localize = True选项,但我直接处理模型而不是表格。

1 个答案:

答案 0 :(得分:1)

您正在查看表单DecimalField的正确轨道。如果检查其来源,您会看到当设置为本地化时,它会通过formats.sanitize_separators运行字符串。您可以直接调用它来转换为Decimal()期望的格式:

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