Numable 创作文档同一份内容也在终端里:`numable docs <主题>`English

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 按币种分组的结果

全局纪律

.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)