场景导入:别让“脏数据”卡住你的自动化流水线
在 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 错误
如果你的源数据中某个字段是 null 或 undefined,直接使用 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)的社区发帖,笔者会亲自为你解答。
相关资源推荐: