如何用正则验证小数位数?Karate脚本验薪资小数点后两位遇错
问题描述
给定JSON响应数据:
[ { "id": 1, "name": "Jack", "salary": 23.03 }, { "id": 2, "name": "Luke", "salary": 0.00 } ]
需要验证salary字段小数点后仅有两位数字,当前使用的Karate脚本如下:
* def salary = $response..salary * karate.appendTo(salary) * def strs = karate.map(salary, function(x){ return x + '' }) * match each strs == '#regex [0-9].+\.[0-9]{2}'
当薪资为23.40或12.30这类带两位小数的值时验证通过,但遇到0、2、3这类整数形式的薪资值时验证失败。
解决方案
原脚本的问题有两个:
- 整数类型的薪资转成字符串后没有小数点(比如
0会变成"0"),无法匹配原正则里强制要求的小数点\. - 原正则
[0-9].+\.[0-9]{2}的[0-9].+部分要求小数点前至少有两位数字,会匹配不到0.00这种小数点前仅一位的情况
下面提供两种可行的修正方案:
方案1:统一格式化后验证(推荐)
先把所有薪资数值格式化为固定两位小数的字符串,再用严格正则验证:
* def salary = $response..salary * def formattedSalaries = karate.map(salary, function(x){ return x.toFixed(2) }) * match each formattedSalaries == '#regex ^\\d+\\.\\d{2}$'
toFixed(2)会自动把任何数值转成带两位小数的字符串:比如0变成"0.00",2变成"2.00",23.03保持"23.03"- 正则
^\d+\.\d{2}$严格匹配「1个或多个数字 + 小数点 + 两位数字」的格式,完全符合需求
方案2:修改正则兼容两种格式
如果不需要强制显式的两位小数格式,允许薪资以整数形式返回(但逻辑上等价于两位小数),可以用更灵活的正则:
* def salary = $response..salary * def strs = karate.map(salary, function(x){ return x + '' }) * match each strs == '#regex ^\\d+(\\.\\d{2})?$'
这个正则的含义:
^\d+:开头是1个或多个数字(\.\d{2})?$:结尾可选的「小数点+两位数字」部分- 既能匹配
"0"、"2"这类整数,也能匹配"23.03"、"0.00"这类标准两位小数
内容的提问来源于stack exchange,提问作者アレックス
相关产品推荐
相关产品推荐

