methods —— 表达式方法全表与 .df 白名单(自动生成)
$[方法::(参数)]只认下面 46 个方法。不在表里的方法名不报错、静默求空(组件上符号还在、数字没了),写之前先来这里对一眼。参数个数是下限,多给的忽略。写法见numable docs df与numable docs rcn。
方法
| 方法 | 参数(最少个数) | 返回 | 注意 |
|---|---|---|---|
calc |
表达式串(1) | number | null | 四则运算与括号。Android 返回 double,整值会渲成 17.0;进文本的数字套一层 round::。尺寸串里凡有 calc,外面必须再套 findNotEmpty:: 兜底,否则算出 null 会变成裸 pt 而整个组件失败。前导零按十进制读(07 就是 7,不是八进制),iPhone / Android / HarmonyOS / 桌面读法一致,不必先过 parseNumber::;首尾空格也会去掉。但只认十进制:0x10 这类写法读不出来,整个表达式恒返空 |
urlEncode |
字符串(1) | string | 拼进 URL 的动态段一律先过它 |
urlDecode |
字符串(1) | string | 解码前会先把 + 换成空格 |
base64Encode |
字符串(1) | string | |
base64Decode |
字符串(1) | string | |
get |
对象, 路径(2) | any | 按路径从对象里取值,路径可以是变量:$[get::(${resp.rates},${q})] 是「按用户选的 key 取一项」的正解。方法参数里的 ${} 只看得见流里已落地的键(action 的 id 结果、op:set 的键),看不见 depends 入参;入参先 op:set 落地再用 |
if |
条件, 真值, 假值(3) | any | 三个参数都要给;它输出的数字别再直接喂 calc::,先落地 |
eq |
值A, 值B(2) | boolean | 两边能转成数字就按数字比:eq::("00","") 与 eq::(空,0) 都为真。判空一律用哨兵 $[if::(eq::(findNotEmpty::(${x},__none__),__none__),0,1)](别用 length::,它对数字恒返 0) |
ne |
值A, 值B(2) | boolean | 与 eq:: 同样的数字化比较规则 |
gt |
值A, 值B(2) | boolean | 任一侧不是数字就恒为假 |
lt |
值A, 值B(2) | boolean | 任一侧不是数字就恒为假 |
ge |
值A, 值B(2) | boolean | 任一侧不是数字就恒为假 |
le |
值A, 值B(2) | boolean | 任一侧不是数字就恒为假 |
or |
条件…(可多个)(1) | boolean | 吃全部参数 |
and |
条件…(可多个)(1) | boolean | 吃全部参数 |
floor |
数字(1) | number | null | Android 返回 double,进文本套 round:: |
round |
数字(1) | number | null | Android 返回 double |
ceil |
数字(1) | number | null | Android 返回 double |
min |
数字…(可多个)(1) | number | null | Android 返回 double |
max |
数字…(可多个)(1) | number | null | Android 返回 double |
parseNumber |
value, pattern(2) | string | null | pattern 语法:0 = 取整(向零截断);0.00 = 固定两位小数;0.## = 最多两位;整数部分含 ,(如 #,##0.00)= 带千分位。数字先格式化再上组件,别让浮点直出;大数字要配千分位或缩小字号,否则会顶出组件边缘 |
formatDate |
时间戳, 格式串(2) | string | null | token 为 yyyy MM dd HH mm ss。喂空串会渲成 1970 的假时间,外面套 findNotEmpty:: 哨兵判空。秒级时间戳先乘 1000。⚠️ 按设备所在时区格式化(iPhone / Android / HarmonyOS / 桌面一致):同一个时间戳在不同时区的机器上渲出来的字不一样,这通常正是你要的(「本地时间几点」) |
parseDate |
文本, 格式串(2) | number | null | 跨端安全的格式只有纯 token 加 - : / 与空格;带字母(如 T、Z)会在 iOS/Android 整条解析失败,先用 subString:: 截干净。⚠️ 按设备所在时区解析:接口给的多半是 UTC(2026-09-08T12:00:00Z 这种),直接喂进来会被当成本地时间,算出的时间戳整整差一个时区,而且不报错。UTC 串要么先减掉时差,要么在数据源那头换成时间戳 |
random |
无(0) | number | 0 到 1 的随机数;别用于组件显示,会让缓存与截图对不上 |
md5_32 |
字符串(1) | string | 32 位小写摘要 |
md5_16 |
字符串(1) | string | 16 位摘要 |
length |
字符串 | 数组 | 对象(1) | number | 对数字返回 0,所以「有没有值」不能用 gt::(length::(数值),0) 判,要在流里落一个显式旗标;length::(数字) 的结果不可依赖,失败判据只对字符串字段用 |
replaceAll |
源串, 正则, 替换串(3) | string | 第二个参数按正则解释,竖线等符号不能直接当分隔符,换成 ~ 之类的普通字符 |
subString |
源串, 起, 止(3) | string | 按码点切,越界会自动收到边界 |
toLowerCase |
字符串(1) | string | |
toUpperCase |
字符串(1) | string | |
endsWith |
源串, 后缀(2) | boolean | |
matches |
源串, 正则(2) | boolean | 正则不合法时返回 false,不报错 |
startsWith |
源串, 前缀(2) | boolean | |
echo |
任意值(0) | 原值 | 原样返回,常用于把表达式结果落地成一个键 |
connect |
片段…(可多个)(1) | string | 会吃掉每个参数两端的空格;Android 上数字会拼成 17.0。要保留空格或做混排,改在 txt 文本里用 ${} 内插 |
split |
源串, 正则(2) | string[] | 第二个参数按正则解释,分隔符别用竖线,否则整串被按字符切开;结果末尾的空串会被去掉 |
index |
字符串 | 数组 | 对象, 下标(2) | 元素 | null | 按下标取元素:字符串按码点、数组按位置、对象按插入顺序的位置;负下标返回 null。对象要按 key 取值用 get::,不是 index::(传字符串 key 会静默取空)。${a[${i}]} 这种嵌套下标不支持,写了静默取空并覆盖默认参数 |
contains |
源串, 子串(2) | boolean | 普通子串包含,不走正则 |
findNotEmpty |
候选…(可多个)(0) | 首个非空值 | 兜底主力:尺寸串里凡有 calc:: 必须用它包一层;时间锚、颜色也用它兜一个字面量,否则空值会让整块消失或整个组件渲不出 |
sum |
数字…(可多个)| 数组(1) | number | 没有数字时返回 0。数组要写成真数组字面量,别塞进方法参数里 |
pluck |
数组, 路径(可选)(1) | array | 从对象数组里摘一列;传进来不是数组就原样返回 |
join |
数组, 分隔符(可选)(1) | string | 分隔符缺省为空串 |
mapField |
数组, 源列, 映射表, 新列, 缺省值(可选)(4) | array | null | 返回新数组(不改原数组):每个对象行浅拷贝后加一列 新列 = 映射表[行[源列]],查不到取缺省值(不给为空串);不是对象的元素原样保留;第一个参数不是数组返回空。查表用的键:字符串原样(不 trim)、整数不带 .0、null / 缺失为空串、布尔为 true / false |
groupSum |
数组, 键列(数组或单个列名), 值列, 权重列(可选)(3) | object | null | 按键列分组求和 Σ 值 × 权重;多个键列得到嵌套对象,叶子是数字。值与权重先 trim 再按十进制解析,解析不了一律按 0。结果按 Math.round(x × 1e6) / 1e6 舍入。空数组返回 {};不是数组、键列为空数组或空串返回空;权重列传空串等于没给。键列数组要先用 op:set 存成变量再传,别在参数里写逗号。键顺序不保证 |
convertSum |
金额表, 汇率表, 目标币(可选)(2) | number | null | Σ 金额[币] / 汇率[币],目标币本身按 1 计;金额为 0 的币跳过。任何一个币查不到汇率(或汇率 ≤ 0)整体为空 —— 宁可显示 --,也不少算。金额表为空或全为 0 返回 0。结果按 Math.round(x × 1e6) / 1e6 舍入。金额表通常是 groupSum 按币种分组的结果 |
全局纪律
- 未注册的方法静默求空:方法表就是上面这些,写错名字或用了表里没有的方法(比如 abs::、avg::、filter::、groupBy::(按列分组求和用 groupSum)、indexOf::、push::)不会报错,只会求出空值,组件上那一处静默消失。求绝对值写 if::(ge::(${v},0),${v},calc::(0-${v}))
- 求值顺序是 $[…] → ${…} → @[…]:先算方法,再取数据变量,最后把字符串结果里的 @[…] 当包内资产引用解析
- 方法嵌套写裸名字:$[…] 里面再调方法直接写 name::(...),不要再写一层 $[,嵌套的 $[ 会让整个组件渲不出来
- @app / @env / @device / @time 是内置的:可以直接取 ${@app.platform} 这类内置变量,不需要自己传
.df 里能出现什么
取数流只认下面这些;出现别的(尤其 ui.* / nav.* / toast)打包即拒。
| 类别 | 允许 |
|---|---|
| action | cancel error finish sleep request clearCookie htmlParse xmlParse log resultfilter resultFilter data.get data.set data.remove data.has data.keys data.getAll data.merge data.clear credential.state |
操作(op 键) |
if for forEach set remove include |
复合(写在 action 位) |
sequential concurrent |
| 明确禁止 | showLoading hideLoading toast 以及全部 App 注入的动作(ui.* nav.* xpage.* widget.* singleValue startPageForResult installBundle) |