零预算也要算得清:一个纯前端预算工具的边界处理实践

举报
yd_283252214 发表于 2026/10/23 11:42:43 2026/10/23
【摘要】 以零算活动预算检查器为例,说明零值与空值的区别、占比除零保护、预算计算验证、本地保存限制,以及原型在金额精度和测试结构上的后续改进方向。

从一个小工具说起

活动预算表的核心运算并不复杂:数量乘单价,再加上备用金。但免费场地、志愿者支持、全部支出为零等场景,会让“正常数字”之外的输入成为日常情况。本文以已经公开的“零算-活动预算检查器”为例,讨论纯前端原型怎样处理这些边界。项目使用原生 HTML、CSS 和 JavaScript,没有后端接口;本文的代码解释基于仓库现有实现,改进建议会另行标明。

项目源码:GitCode上的 amsssssss222/budget-checker-20261022;华为云作品馆中的《零算-活动预算检查器》。

一、先把计算口径写出来

这个工具采用下面的计算规则:

  • 单项小计=数量×单价。
  • 基础预算=所有单项小计之和。
  • 备用金=基础预算×备用金比例。
  • 总预算=基础预算+备用金。
  • 单项占比=单项小计÷基础预算×100%。

普通活动示例含场地2000元、音响800元、海报750元、矿泉水240元、餐费280元和纪念品750元。基础预算应为4820元,10%备用金为482元,总预算为5302元。先得到一组可手算的结果,才有核对页面的依据。

二、零不是“没有填写”

免费赞助场地的单价为0,这是有效业务数据;空白输入则表示用户尚未提供数值。不能仅用 if (!value) 判断输入,否则数值0也会被拦截。现有实现先判断空字符串、null和undefined,再解析数字,并分别拒绝非有限数与负数。

需要留意一个原型限制:当前解析使用parseFloat。它可以从部分带后缀的字符串中读出数字,例如 parseFloat("12abc") 会得到12。因此,“能解析出数字”并不等于“整段输入都是合法金额”。现有number输入控件能限制一部分交互,但若以后添加CSV导入或文本粘贴解析,仍应在数据入口做完整校验。上述行为可参见MDN Web Docs的《Number.parseFloat()》说明。

可考虑的改进是:先对空白单独处理,再使用明确的数字格式规则或整体转换,最后检查有限性与业务范围。这是后续改进方向,并非声称当前版本已经实现。

三、占比必须先判断分母

当全部项目免费时,基础预算为0。此时直接进行0÷0会得到NaN。项目把“零预算时的占比显示为0”定义为界面约定,并在计算前处理:

function itemPercent(item, base) {
  if (base <= 0) return 0;
  return (item.qty * item.price / base) * 100;
}

这个分支的意义是让读者知道“当前没有可分摊的支出”。它不是说数学上0÷0等于0。实际用于统计分析的系统,也可以显示“—”或“不适用”,关键是明确约定,并让表格、图表和导出遵循同一规则。

同样,格式化函数把非有限数显示成0,只能作为最后的界面保护。排查问题时仍要回到输入和计算环节,不能靠统一显示0掩盖上游错误。

四、验证要同时覆盖计算和交互

该原型此前已检查过以下页面行为:清空列表后汇总为0;加载零经费示例后各项占比为0;普通示例合计为5302元;负单价被拒绝并恢复原值;刷新后能恢复同一浏览器中保存的数据。

场景 应检查的结果
空列表 汇总为0,显示空状态
数量为0或单价为0 允许输入,小计为0
基础预算为0 不出现NaN或Infinity
普通示例、10%备用金 4820+482=5302
负数、空值、无效数字 显示错误,不写入有效数据
刷新页面 正常存储环境下恢复上次数据

仓库还包含test.js,可用 node test.js 运行计算示例。但当前测试文件复制了一份计算函数,存在测试逻辑与页面实现逐渐分叉的风险。更稳妥的后续设计,是把纯计算函数独立为模块,页面与测试共同引用,再保留少量浏览器测试检查真实交互。

五、本地保存方便,但不等于备份

项目把预算保存在localStorage中,正常情况下刷新后可以恢复。它受页面来源、浏览器配置和存储策略影响;清除网站数据、更换浏览器或设备,都不能期待自动找回同一份预算。直接通过file地址打开时,各浏览器的存储行为也不宜作为稳定承诺。相关边界参见MDN Web Docs的《Window.localStorage》说明。

因此,重要预算应另行导出并保存文件。当前CSV导出用于查看明细和汇总,没有实现CSV导入恢复,不能把导出文件描述为可一键还原的完整备份。

六、把原型适用范围说清楚

目前金额使用JavaScript Number运算,页面显示保留两位小数。显示格式不等于底层精确到分;若用于真实结算,应事先约定数量精度、金额舍入时点和汇总口径,再采用经过验证的定点金额或十进制方案。

这个项目适合学习前端表格、计算逻辑和边界测试,也适合简单活动预算估算。发布一个小原型时,把已验证的行为和尚未完成的改进分开写清楚,能让其他开发者更容易复现、评审和继续完善。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。