n8n Set节点计算字段值实战:从字符串到数字的转换

2026-02-20 12 0

场景导入:别让“脏数据”卡住你的自动化流水线

在 N8N 大学的后台,笔者每天都能收到大量关于数据清洗的咨询。最常见的痛点是什么?API 返回的数据,明明是数字,却给你包了一层字符串的外衣。

比如,电商订单金额是 "128.50",库存数量是 "500",用户 ID 是 "10086"。在 n8n 里,这些带引号的值都被视为文本(String)。

这会导致什么后果?一旦你想做数学运算——比如计算总销售额、判断库存是否低于警戒线,或者单纯想把两个数字拼接——n8n 就会报错或直接拼接字符串,结果往往不是你想要的。

手动转换?那是低效的重复劳动。今天,笔者就带你硬核实战,利用 n8n 的 **Set** 节点,轻松搞定从字符串到数字的转换,让你的自动化流程真正“智能”起来。

核心实操:Set节点的三种“变身”术

在 n8n 中,**Set** 节点不仅仅是一个简单的变量赋值工具,它更是数据类型的“整形医生”。虽然 n8n 有专门的 Number 节点,但在处理简单转换时,Set 节点往往更直观、更高效。

第一步:准备工作与数据模拟

在开始之前,我们不需要复杂的外部 API。直接使用 n8n 的 Manual 节点作为触发器,并手动配置一些“脏数据”。

创建一个 JSON 数据结构,模拟我们常见的场景:

{
  "price": "29.99",
  "stock": "150",
  "discount": "0.8",
  "product_name": "N8N 课程"
}

这里的关键在于:价格、库存和折扣都是带双引号的字符串格式。我们的目标是将它们转换为真正的数字类型,以便进行后续计算(例如:折后价 = 价格 * 折扣)。

第二步:使用 Set 节点直接转换(最简单的方法)

这是最“硬核”的方法,利用 JavaScript 的原生能力或 n8n 的自动推断。

在工作流中添加一个 Set 节点。点击 "Add Field",我们输入以下配置:

  • Field Name (字段名): calculated_price
  • Value (值): {{ $json.price * $json.discount }}

注意这里的关键点:虽然 $json.price 是字符串 "29.99",但当你使用乘号 * 运算符时,n8n(底层基于 JavaScript)会尝试将操作数转换为数字进行运算。

点击运行节点,你会发现输出的 calculated_price 是一个数字 23.992,并且在 JSON 结果中没有引号。这就是自动类型转换的魔力。

第三步:显式转换与数学计算(更稳妥的方法)

虽然自动转换很方便,但为了代码的可读性和确定性,笔者更推荐显式转换。特别是当你需要处理像库存这样的整数时。

在同一个 Set 节点中,我们可以添加更多字段来演示不同的转换逻辑:

  • Field 1: fixed_price, Value: {{ parseFloat($json.price) }}
  • Field 2: int_stock, Value: {{ parseInt($json.stock, 10) }}
  • Field 3: math_result, Value: {{ parseFloat($json.price) * parseFloat($json.discount) }}

参数详解:

  • parseFloat(): 将字符串解析为浮点数(带小数),适合金额。
  • parseInt(..., 10): 将字符串解析为整数,第二个参数 10 代表十进制,这是一个良好的编程习惯,避免解析错误。

通过这种方式,无论输入数据多么“脏”,只要它符合数字格式,你都能强制将其转换为所需的数字类型,确保后续流程的稳定性。

避坑指南:新手最容易踩的两个坑

数据转换看似简单,但实战中常有意外。以下是 N8N 大学总结的高频报错点:

1. 空值(Null)导致的 NaN 错误

如果你的源数据中某个字段是 nullundefined,直接使用 parseInt() 或数学运算会得到 NaN (Not a Number)。

解决方案: 使用 n8n 的表达式函数进行容错处理。

{{ $json.price ? parseFloat($json.price) : 0 }}

这句表达式的含义是:如果 $json.price 存在,则转换为浮点数;如果不存在(为 null/undefined),则默认赋值为 0。这能极大地提升流程的鲁棒性。

2. 千分位分隔符引发的解析失败

在某些地区,数字格式可能是 "1,234.56"。如果你直接对这个带逗号的字符串使用 parseFloat(),结果将是 1,因为解析器在遇到第一个非数字字符(逗号)时就停止了。

解决方案: 在转换前,先用表达式去掉分隔符。

{{ parseFloat($json.price.replace(/,/g, '')) }}

这里的 .replace(/,/g, '') 使用正则表达式全局替换掉了所有的逗号,确保 n8n 能正确解析。

FAQ 问答

Q1: 为什么我用 Set 节点转换了类型,但下游节点还是报错?

笔者解答: 这通常是因为数据在流出 Set 节点后,又被其他节点(如 HTTP Request)意外修改了。请检查两个地方:1. 下游节点是否开启了“Raw Body”或特殊的数据处理模式;2. 确保 Set 节点的输出没有被意外覆盖。建议使用 Debug 节点查看两个节点之间的数据差异。

Q2: 除了 Set 节点,还有其他转换数字的方法吗?

笔者解答: 当然有。n8n 官方提供了专门的 Number 节点,它不仅可以转换类型,还能进行格式化(如保留两位小数)。如果你的流程非常复杂,涉及大量数据清洗,建议使用 Code 节点配合 Lodash 库进行批量处理,效率更高。

Q3: 转换后的数字精度丢失了怎么办?

笔者解答: 浮点数运算在任何编程语言中都存在精度问题(例如 0.1 + 0.2 !== 0.3)。如果涉及高精度的金融计算,建议在 n8n 中先将金额乘以 100 转为整数(分),运算完成后再除以 100 转回元。或者,使用 toFixed(2) 限制小数位数,但要注意它返回的是字符串,可能需要再次转换。

总结与资源

在 n8n 的世界里,数据类型就是流动的血液。掌握从字符串到数字的转换,是构建健壮自动化流程的基石。不要迷信默认设置,主动控制数据类型,才能让你的机器人真正听懂你的指令。

如果你在实操中遇到了更诡异的数据格式问题,欢迎在 N8N 大学(n8ndx.com)的社区发帖,笔者会亲自为你解答。

相关资源推荐:

相关文章

n8n Error Handling 节点报错太心烦?试试这些更灵活的替代方案
n8n 节点报错了?用 Error Handling 让它自动重试并通知你
n8n Wait节点在数据同步中的延迟控制实战
n8n Wait节点免费版:我能用它实现定时任务吗?
n8n Error Handling节点:当自动化流程“翻车”时,如何让它自动“扶起来”?
n8n Error Handling节点报错常见问题解决

发布评论