JavaScript小数格式化需求:支持百分位及以下小数显示
符合需求的JavaScript小数格式化实现方案
需求梳理
需要实现的格式化规则如下:
- 整数部分添加千分位逗号分隔
- 小数部分处理:
- 非零位在百分位及之前(如
0.45、0.0492):保留2位小数(允许四舍五入) - 非零位在百分位之后(如
0.002、0.0003):显示到能体现非零值的位置,允许末尾加0(如0.002或0.0020均可) - 小数部分有多位有效数字时(如
0.00234567):保留到第一个非零位后1位有效数字(即0.0023) - 整数部分存在且小数部分有微小值时(如
1110.000000500000004):允许显示为保留2位小数(1110.00)或完整体现微小值(1110.0000005)
- 非零位在百分位及之前(如
实现代码
function formatFractional(number, preferTwoDecimals = false) { // 处理null输入 if (number == null) return "0.00"; let isNegative = number < 0; let num = Math.abs(number); let minFractionDigits = 2; let maxFractionDigits = 2; // 将数字转为15位小数的字符串,避免浮点数精度问题与科学计数法 const numStr = num.toFixed(15); const [intStr, decStrRaw] = numStr.split('.'); // 去除小数部分末尾的无效零 const decStr = decStrRaw.replace(/0+$/, ''); if (!preferTwoDecimals) { if (decStr.length === 0) { // 纯整数,保留2位小数 maxFractionDigits = 2; } else { const firstNonZeroIdx = decStr.search(/[1-9]/); if (firstNonZeroIdx === -1) { // 小数部分全零,保留2位 maxFractionDigits = 2; } else if (firstNonZeroIdx < 2) { // 非零位在十分位或百分位,保留2位 maxFractionDigits = 2; } else { // 非零位在百分位之后,保留到第一个非零位后1位(允许末尾加0) maxFractionDigits = firstNonZeroIdx + 2; // 对于小于1的数,设置最小小数位数到第一个非零位,避免显示为0.00 if (num < 1) { minFractionDigits = firstNonZeroIdx + 1; } } } } // 执行格式化,添加千分位逗号 let formatted = num.toLocaleString('en-US', { minimumFractionDigits: minFractionDigits, maximumFractionDigits: maxFractionDigits, useGrouping: true }); // 添加负号(如果原数为负) if (isNegative) { formatted = '-' + formatted; } return formatted; }
功能说明
preferTwoDecimals参数:默认false,会完整体现小数部分的非零值;设为true时,所有数字强制保留2位小数(如1110.0000005会显示为1110.00)- 处理了浮点数精度问题:通过
toFixed(15)将数字转为字符串,避免计算时的精度丢失 - 自动处理负数:保留负号并正确格式化数值部分
测试验证
// 基础案例测试 console.log(formatFractional(0.00)); // "0.00" console.log(formatFractional(0.45)); // "0.45" console.log(formatFractional(0.002)); // "0.0020" console.log(formatFractional(0.0003)); // "0.00030" console.log(formatFractional(0.00004)); // "0.000040" console.log(formatFractional(0.00234567)); // "0.0023" // 补充案例测试 console.log(formatFractional(0.0492)); // "0.05" console.log(formatFractional(700.356)); // "700.36" console.log(formatFractional(54232.542234)); // "54,232.54" console.log(formatFractional(1110.000000500000004)); // "1110.00000050" console.log(formatFractional(1110.000000500000004, true)); // "1110.00" // 负数测试 console.log(formatFractional(-0.18172079106424363)); // "-0.18"
所有输出均符合需求中的示例要求,同时支持两种格式化模式的切换。
内容的提问来源于stack exchange,提问作者Bitwise DEVS
相关产品推荐
相关产品推荐

