如何仅移除全为0的小数部分?禁用Math.round等指定方法
解决方法:用字符串处理精准控制小数部分的保留
嘿,这个需求确实有点 tricky,不过咱们可以避开那些被限制的数值方法,从字符串处理的角度来实现,完美匹配你的要求——只有当小数部分全为0时才移除,否则保留原格式(包括末尾的0)。
方法一:正则表达式匹配法
核心思路是把输入转成字符串后,用正则匹配“整数部分+小数点+全0小数部分”的格式,匹配成功就截断小数部分,否则保留原字符串。
如果你的输入是字符串类型(比如从表单输入框获取的内容),可以直接用这个版本:
function formatTargetNumber(numStr) { // 检查是否是"X.00"/"X.000..."这类格式 if (/^\d+\.0+$/.test(numStr)) { return numStr.split('.')[0]; } return numStr; } // 测试用例 console.log(formatTargetNumber('50.00')); // 输出 '50' console.log(formatTargetNumber('60.50')); // 输出 '60.50' console.log(formatTargetNumber('123')); // 输出 '123' console.log(formatTargetNumber('78.0000')); // 输出 '78' console.log(formatTargetNumber('99.99')); // 输出 '99.99'
如果你的输入是数值类型(比如JS里的60.50,但要注意JS数值本身会把60.50存成60.5),那咱们先把数值转成固定小数位的字符串(比如两位),再处理:
function formatTargetNumber(num) { // 先把数值转成两位小数的字符串,确保末尾的0不会丢失 const numStr = typeof num === 'number' ? num.toFixed(2) : String(num); // 针对两位小数的场景,匹配"X.00"格式 if (/^\d+\.00$/.test(numStr)) { return numStr.split('.')[0]; } return numStr; } // 测试用例 console.log(formatTargetNumber(50.00)); // 输出 '50' console.log(formatTargetNumber(60.50)); // 输出 '60.50' console.log(formatTargetNumber(123)); // 输出 '123' console.log(formatTargetNumber(78.0000)); // 输出 '78' console.log(formatTargetNumber(99.99)); // 输出 '99.99'
方法二:逐字符检查小数部分
如果你觉得正则不够直观,也可以把字符串按小数点拆分,然后逐个检查小数部分的字符是不是全为0:
function formatTargetNumber(num) { const numStr = typeof num === 'number' ? num.toFixed(2) : String(num); const [integerPart, decimalPart] = numStr.split('.'); // 如果有小数部分,且每一位都是0,就返回整数部分 if (decimalPart && decimalPart.split('').every(char => char === '0')) { return integerPart; } return numStr; } // 测试用例和上面一致,结果相同
关键注意点
- 如果你处理的是JS原生数值,一定要先转成固定小数位的字符串(比如
toFixed(2)),因为JS的数值存储不会保留末尾的无效0,60.50在JS里其实就是60.5,直接转字符串会变成"60.5",没法保留60.50的格式。 - 这两种方法都完全避开了你提到的
parseFloat()、Math.round()等禁用方法,纯靠字符串操作实现需求。
内容的提问来源于stack exchange,提问作者San Daniel
相关产品推荐
相关产品推荐

