跳转到主要内容

货币字段和z3c.form支持。

项目描述

https://github.com/zopefoundation/z3c.currency/actions/workflows/tests.yml/badge.svg https://coveralls.io/repos/github/zopefoundation/z3c.currency/badge.svg?branch=master https://img.shields.io/pypi/v/z3c.currency.svg https://img.shields.io/pypi/pyversions/z3c.currency.svg

一个实现货币字段的软件包,用于 zope.schema,并支持使用该字段与 z3c.form

详细文档

货币字段

货币字段是一个数值字段,专门设计用于管理货币值。

>>> from z3c.currency import field, interfaces
>>> price = field.Currency(
...    title='Price',
...    description='The price of the item.')

除了常见的属性外,货币字段还提供了两个附加属性,精度和单位。精度用于指定值是提供的整数单位还是整个单位的1/100 - 在美元和分的情况下。默认情况下,此字段设置为分。

>>> price.precision is interfaces.CENTS
True

它可以设置为美元

>>> price.precision = interfaces.DOLLARS
>>> price.precision is interfaces.DOLLARS
True

对于财务应用,我们有时还需要子分

>>> price.precision = interfaces.SUBCENTS
>>> price.precision is interfaces.SUBCENTS
True

注意:是否有更“国际化”的词来表示货币的整个单位?

单位指定了所使用货币的符号。它也用于将数值格式化为字符串。

>>> price.unit
'$'
>>> price.unit = 'SEK'
>>> price.unit
'SEK'

当然,这两个属性都可作为构造函数参数使用

>>> price = field.Currency(
...    title='Price',
...    description='The price of the item.',
...    precision=interfaces.DOLLARS,
...    unit='SEK')
>>> price.precision is interfaces.DOLLARS
True
>>> price.unit
'SEK'

现在让我们看看验证。首先,值必须始终是十进制数

>>> import decimal
>>> price.validate(decimal.Decimal('12'))
>>> price.validate(12)
Traceback (most recent call last):
...
z3c.currency.interfaces.WrongCurrencyType: int
>>> price.validate(12.0)
Traceback (most recent call last):
...
z3c.currency.interfaces.WrongCurrencyType: float

此外,当精度设置为“美元”时,就像这里的情况,值必须是一个整数。

>>> price.validate(decimal.Decimal('12'))
>>> price.validate(decimal.Decimal('12.01'))
Traceback (most recent call last):
...
z3c.currency.interfaces.IncorrectValuePrecision: 0
>>> price.validate(decimal.Decimal('12.00'))
Traceback (most recent call last):
...
z3c.currency.interfaces.IncorrectValuePrecision: 0

当精度设置为“分”时,

>>> price.precision = interfaces.CENTS

则只接受有两位小数的值。

>>> price.validate(decimal.Decimal('12.00'))
>>> price.validate(decimal.Decimal('12'))
Traceback (most recent call last):
...
z3c.currency.interfaces.IncorrectValuePrecision: 1
>>> price.validate(decimal.Decimal('12.0'))
Traceback (most recent call last):
...
z3c.currency.interfaces.IncorrectValuePrecision: 1

如果我们允许小于分的金额,

>>> price.precision = interfaces.SUBCENTS

则允许任何精度。

>>> price.validate(decimal.Decimal('12.0'))
>>> price.validate(decimal.Decimal('12'))
>>> price.validate(decimal.Decimal('12.00001'))

如果该字段不是必需的,…

>>> price.required = False

确保验证仍然通过。

>>> price.validate(None)

请注意,IFromUnicode接口是故意不支持的。

>>> price.fromUnicode
Traceback (most recent call last):
...
AttributeError: 'Currency' object has no attribute 'fromUnicode'

z3c.form 支持

此包还提供与 z3c.form 包的集成支持。特别是它实现了一个从 Currency 字段到接受 Unicode 字符串的任何小部件的数据转换器。

>>> from z3c.currency import converter
>>> conv = converter.CurrencyConverter(price, None)
>>> conv
<DataConverter from Currency to NoneType>

转换器可以轻松地将任何值转换为字符串。

>>> conv.toWidgetValue(decimal.Decimal(12))
'12'
>>> conv.toWidgetValue(decimal.Decimal(1200))
'1,200'
>>> conv.toWidgetValue(decimal.Decimal(-12))
'-12'
>>> conv.toWidgetValue(decimal.Decimal('-12.0'))
'-12.00'
>>> conv.toWidgetValue(decimal.Decimal('-12.00'))
'-12.00'

请注意,始终打印两位小数。您还可以将精度设置为“美元”。

>>> conv.field.precision = interfaces.DOLLARS
>>> conv.toWidgetValue(decimal.Decimal(12))
'12'
>>> conv.toWidgetValue(decimal.Decimal('12.00'))
'12'

让我们也尝试小于分的金额。

>>> conv.field.precision = interfaces.SUBCENTS
>>> conv.toWidgetValue(decimal.Decimal('12.00'))
'12.00'
>>> conv.toWidgetValue(decimal.Decimal('12'))
'12'
>>> conv.toWidgetValue(decimal.Decimal('12.0001'))
'12.0001'

如果值缺失,则优雅地处理。

>>> conv.toWidgetValue(None)
''

现在让我们解析一个值。解析器有一定的灵活性,不仅接受输出值,…

>>> conv.field.precision = interfaces.CENTS
>>> conv.toFieldValue('12')
Decimal('12.00')
>>> conv.toFieldValue('1,200')
Decimal('1200.00')
>>> conv.toFieldValue('-12')
Decimal('-12.00')
>>> conv.toFieldValue('-12.00')
Decimal('-12.00')
>>> conv.field.precision = interfaces.DOLLARS
>>> conv.toFieldValue('12')
Decimal('12')
>>> conv.toFieldValue('12.00')
Decimal('12')
>>> conv.field.precision = interfaces.SUBCENTS
>>> conv.toFieldValue('12')
Decimal('12')
>>> conv.toFieldValue('12.00')
Decimal('12.00')
>>> conv.toFieldValue('12.0000')
Decimal('12.0000')
>>> conv.toFieldValue('12.0001')
Decimal('12.0001')

还接受其他输入值。

>>> conv.toFieldValue('1200')
Decimal('1200')

如果浏览器发送一个空字符串,则优雅地处理。

>>> conv.toFieldValue('')

变更记录

2.0 (2023-02-08)

  • 放弃对 Python 2.7、3.5、3.6 的支持。

  • 添加对 Python 3.8、3.9、3.10、3.11 的支持。

  • 放弃使用 python setup.py test 运行测试的过时支持。

1.2.0 (2018-11-14)

  • Python 3.6 和 3.7 支持。放弃 Python 2.6。

  • 测试现在使用 python setup.py test 运行。

1.1.1 (2015-11-09)

  • 标准化命名空间 __init__。

1.1.0 (2013-09-27)

  • 添加了新的精度值“sub-cents”(interfaces.SUBCENTS),这允许超过便士的精度,这对于金融和其他商业应用是必需的。

1.0.0 (2013-08-16)

  • 更新了 Trove 分类器。

  • 将代码移动到 GitHub。

  • 将验证改为抛出自定义验证错误,因为上游代码查看异常的文档字符串而不是第一个参数。

  • 改进了转换器,

    • 确保初始解析后的十进制精度正确。

    • 将值格式化为正确的精度。

  • ICurrency 接口中的“精度”字段改为选择,以便 UI 生成的效果更好。

  • 稍微整理了代码。

0.1.0 (2007-09-12)

  • 初始发布

    • 实现了支持精度和单位的 Currency 字段。

    • 实现了数据转换器。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

z3c.currency-2.0.tar.gz (10.3 kB 查看哈希值)

上传日期

构建分布

z3c.currency-2.0-py3-none-any.whl (12.1 kB 查看哈希值)

上传日期 Python 3

支持