数字缩写还原函数格式校验缺陷及优化需求
优化数字缩写还原函数的格式校验逻辑
原函数的核心问题是未对输入格式做严格校验,仅通过粗暴过滤字符处理输入,导致不符合数字+缩写字母规范的内容也能被错误处理。我们可以通过正则表达式精准匹配合法格式,在处理前完成严格校验,具体优化方案如下:
优化后的代码
const abbr = require('./numberAbbreviates.json'); function unabbreviate(input) { // 输入类型校验 if (typeof input !== 'string') { return new Error('Paramentro deve ser do tipo String.'); } // 匹配合法格式:开头为整数/小数,后续可选多字符缩写字母,整个字符串需完全匹配 const validPattern = /^(\d+(\.\d+)?)([A-Za-z]+)?$/; const matchResult = input.match(validPattern); // 格式不合法直接返回错误 if (!matchResult) { return new Error('Entrada inválida: formato deve ser "número+sigla" (ex: 1.5k) ou apenas número.'); } const [, numStr, , abbrStr] = matchResult; const number = Number(numStr); // 校验数字有效性 if (isNaN(number)) { return new Error('Número inválido na entrada.'); } // 无缩写的纯数字情况,直接返回数值 if (!abbrStr) { return number; } // 统一转大写匹配配置项(兼容小写输入) const upperAbbr = abbrStr.toUpperCase(); // 缩写未配置则返回错误 if (!abbr[upperAbbr]) { return new Error(`Sigla "${upperAbbr}" não está configurada.`); } // 合法情况计算并返回结果 return number * abbr[upperAbbr]; }
关键优化点
- 严格格式校验:使用正则
^(\d+(\.\d+)?)([A-Za-z]+)?$确保输入只能是「纯数字」或「数字+缩写字母」的格式,拒绝任何多余字符(如@1.55@k)和字母前置的情况(如k1.5)。 - 精准内容提取:通过正则捕获组分别提取数字和缩写部分,避免原函数粗暴过滤字符导致的逻辑混乱。
- 大小写兼容:将输入的缩写统一转大写后匹配配置,支持小写输入(如
1.5k自动匹配K配置)。 - 明确错误反馈:针对不同非法场景返回对应错误信息,便于调试和异常处理。
测试验证
// 合法输入 unabbreviate('1.5k'); // 1500 unabbreviate('1.55k'); // 1550 unabbreviate('123'); // 123 unabbreviate('45Qa'); // 45000000000000000 // 非法输入返回错误 unabbreviate('k1.5'); // Error: Entrada inválida... unabbreviate('@1.55@k'); // Error: Entrada inválida... unabbreviate('123abc'); // Error: Sigla "ABC" não está configurada. unabbreviate(''); // Error: Número inválido na entrada.
内容的提问来源于stack exchange,提问作者VK_
相关产品推荐
相关产品推荐

