剪贴板无法直接限制“只复制数字”,必须在写入前对数据进行校验和格式化:先判断是否为有效数字,再转为纯整数字符串;H5端用navigator.clipboard.writeText前需清洗字符;各平台需适配权限与提示。

不能直接限制剪贴板“只复制数字”,剪贴板本身是系统级的通用缓冲区,没有类型过滤能力。真正可控的是:你往剪贴板里塞什么、以及用户复制前你对原始内容做了什么处理。
uni.setClipboardData 传入前必须做数字校验和格式化
这个 API 的 data 参数只认字符串,传数字会自动转成字符串,但如果你传的是 123.456 或 NaN 或 null,结果可能不符合预期——比如 NaN 变成 "NaN",null 变成 "null"。
- 先用
typeof value === 'number' && !isNaN(value) && isFinite(value)判断是否为有效数字 - 再用
String(Math.round(value))或value.toFixed(0)转成纯整数字符串(按需选择舍入方式) - 避免直接
String(value),否则123.00会变成"123.00",带小数点就不算“纯数字”了 - 如果原始数据来自 input 输入框,注意它返回的是字符串,得先
parseFloat()再验证,否则"123abc"会被转成123—— 这未必是你想要的“限制”
H5 端用 navigator.clipboard.writeText 前也要清理
H5 不走 uni.setClipboardData,而是调 navigator.clipboard.writeText(),但它同样只接受字符串,且不会帮你校验内容。如果你没提前处理,用户点一下就复制了乱码或小数,那就不是“限制”,而是放行了。
- 务必在调用前做一次清洗:
const numStr = String(num).replace(/[^0-9]/g, '')(仅保留数字字符) - 但注意:这样会把
"-123"变成"123",负号丢了;如需支持负数,改用.replace(/[^0-9-]/g, '').replace(/^-+/, '-') - 别依赖
input[type="number"]的值——它的value仍是字符串,且用户可能粘贴非数字内容进去 - 更稳妥的做法是在输入阶段就拦截,比如
@input时用正则过滤:v-model绑定前先text.replace(/[^0-9-]/g, '')
小程序/APP 端权限和提示要适配数字场景
复制纯数字时,用户感知弱,容易误以为没成功。尤其微信小程序默认 toast 是“已复制”,但用户不知道复制的是不是自己想要的数字。
- 建议关掉系统默认提示:
showToast: false,然后自己弹uni.showToast({ title: `已复制数字: ${numStr}` }) - App 端 iOS 需在
manifest.json → App 设置 → iOS 设置勾选「剪贴板」;Android 要在「模块权限配置」启用clipboard模块,否则连空字符串都写不进去 - 微信小程序必须在
mp-weixin节点下声明权限:"permission": { "scope.writeClipboard": { "desc": "用于复制邀请码等数字信息" } },不然真机静默失败 - 鸿蒙端读取剪贴板还要额外加
ohos.permission.READ_PASTEBOARD,但你这里是写入,不用管读权限
真正难的不是“怎么复制数字”,而是“怎么确保复制进去的一定是你要的数字”。所有平台都绕不开前置清洗——剪贴板不会替你做判断,它只忠实执行你给的字符串。











