在网站运营中,我们经常会遇到需要处理商品价格或服务费用等数值型数据。这些数据有时会存储在自定义字段中,但由于多种原因,它们可能以字符串(文本)的形式保存,例如“199.50元”或“150”。当我们需要在模板中对这些价格进行加总计算(如订单总计)时,直接对字符串进行“相加”操作会得到意想不到的结果(如“199.5015.00”而不是“214.50”)。这时,就需要将这些字符串价格转换为真正的数字,才能进行正确的数学运算。

AnQiCMS 提供了强大的模板标签和过滤器,可以非常灵活地处理这类数据转换和计算问题。

理解自定义字段中的价格数据

AnQiCMS 允许我们根据业务需求自定义内容模型,这意味着我们可以为文章、产品等内容添加各种额外字段。在创建这些自定义字段时,我们可以选择不同的字段类型,例如“单行文本”、“数字”等。如果我们将价格信息不小心或者出于特定目的,选择“单行文本”类型来存储,那么即使内容输入的是纯数字,在模板中获取到的也会是字符串。

例如,您可能创建了一个名为 product_price_str 的自定义字段,并输入了“99.99”。在模板中直接引用 {{ archive.product_price_str }} 得到的就是文本“99.99”,而不是一个可以用来计算的数字。

核心步骤一:将字符串价格转换为数字

AnQiCMS 模板引擎内置了几个实用的过滤器,专门用于数据类型转换,其中 floatinteger 是我们处理价格转换的关键。

  1. float 过滤器: 当您的价格可能包含小数(如 199.50)时,float 过滤器是理想的选择。它会将字符串尝试转换为浮点数。

    • 用法示例: {{ "99.99"|float }} 会得到数字 99.99
    • 如果转换失败(例如字符串是“免费”),它会默认返回 0.0,这在处理异常数据时非常有用,可以避免模板出错。
  2. integer 过滤器: 如果您的价格总是整数(如 150),integer 过滤器则更为合适。它会将字符串尝试转换为整数。

    • 用法示例: {{ "150"|integer }} 会得到数字 150
    • 如果字符串包含小数(如“99.99”),integer 过滤器会截断小数部分,只保留整数(即得到 99)。因此,除非您明确不需要小数,否则处理价格时通常建议使用 float
    • float 类似,转换失败时会返回 0

根据您的价格数据是否包含小数,选择 floatinteger 过滤器至关重要。对于涉及货币的场景,通常推荐使用 float 以保留精确度。

核心步骤二:执行数字运算并格式化显示

一旦我们将字符串价格转换为数字,就可以利用 AnQiCMS 模板的算术运算能力进行加总。

  1. add 过滤器进行加法运算: add 过滤器可以方便地将两个数字相加。它能够处理整数、浮点数甚至字符串的混合相加,但在我们已经转换为数字之后,它将进行精确的数字加法。

    • 用法示例: {% set result = price1|add:price2 %}
  2. 模板直接支持算术运算: 除了 add 过滤器,AnQiCMS 的模板引擎也直接支持 +, -, *, / 等基本算术运算符,这使得复杂的计算逻辑得以在模板中实现。

    • 用法示例: {% set total = price1 + price2 * quantity %}
  3. floatformat 过滤器格式化输出: 在进行价格计算后,通常还需要将结果格式化成标准的货币形式,例如保留两位小数。floatformat 过滤器可以实现这一点。

    • 用法示例: {{ total|floatformat:2 }} 会将数字格式化为保留两位小数的字符串(如 214.50)。如果数字是 214floatformat:2 也会输出 214.00

实战演练:在模板中计算订单总计

让我们通过一个具体的例子,来展示如何将从自定义字段获取的字符串价格转换为数字并计算订单总计。

假设我们的“产品”内容模型有两个自定义字段:

  • single_product_price:产品单价,存储为字符串,例如“199.50”。
  • shipping_fee:运费,存储为字符串,例如“15.00”。

现在,我们想在订单详情页展示这些信息,并计算总价。

”`twig {# 假设我们正在某个文档详情页,需要获取该文档的自定义价格字段 #}

{# 1. 获取产品单价,并使用 float 过滤器转换为数字 #} {% archiveDetail productPriceStr with name=“single_product_price” %} {% set productPrice = productPriceStr|float %} {# 如果自定义字段可能为空,可以添加默认值,例如 {% set productPrice = productPriceStr|default:“0”|float %} #}

{# 2. 获取运费,并使用 float 过滤器转换为数字 #} {% archiveDetail shippingFeeStr with name=“shipping_fee” %} {% set shippingFee = shippingFeeStr|float %} {# 如果自定义字段可能为空,可以添加默认值,例如 {% set shippingFee = shippingFeeStr|default:“0”|float %} #}

{# 3. 执行总计计算 #} {% set totalAmount = productPrice|add:shippingFee %} {# 或者直接使用算术运算符:{% set totalAmount = productPrice + shippingFee %} #}

订单详情

产品单价:¥{{ productPrice|floatformat:2 }}

运费:¥{{ shippingFee|floatformat:2 }}


订单总计:¥{{ totalAmount|floatformat:2 }}

{# 如果需要计算多个产品的总价,并且这些产品在列表中,可以这样操作 #} {# 假设有一个商品列表变量 `