专题:输入与交互

在这里插入图片描述

金额输入到“12.”时,小数点立即消失;输入“0.05”又经历多次跳动。每次 onChangeText 都 parseFloat,再把数值转回字符串,丢掉了用户尚未完成的输入状态。

先理解问题

编辑草稿是字符串,业务金额是经过校验的数值表示。它们拥有不同合法范围:“12.”可以是合理草稿,却不是最终展示格式。输入期间先保护用户意图,提交时再转换。

实现路径

  1. state 保存原始草稿,只进行必要的长度与字符约束。
  2. 失焦或提交时校验小数位、范围和是否为空,生成最小货币单位。
  3. 格式化金额用于展示区域,避免每次键入都重排输入内容。

核心示例

function toCents(text: string): number | null {
  if (!/^\d+(\.\d{1,2})?$/.test(text)) return null;
  const [whole, fraction = ''] = text.split('.');
  const result = Number(whole) * 100 + Number(fraction.padEnd(2, '0'));
  return Number.isSafeInteger(result) ? result : null;
}

示例限定非负、点号小数和两位精度,属于明确的产品输入协议,不适用于所有货币与地区。键盘类型只能改善输入便利性,不能代替校验;粘贴、硬件键盘和辅助输入仍可能带来其他字符。

怎么验证

  • 输入“12.”时不强制删点。
  • 提交“0.05”得到 5 个最小单位。
  • 空串、三位小数和超范围数据得到明确反馈。

适用范围与参考

示例用于说明设计与排查方法,非完整应用,也不代表已经过设备实测。 组件片段需接入对应项目;文中自定义函数、示意协议和策略数值需按业务补齐。迁移到 OHOS 时应另外核对适配层支持。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐