最近项目中有这样需求,将一个数字字符串处理为需要的格式,比如:
var num = 0.431 // 处理为0.44var num2 = 1.998 // 处理为2.00复制代码
所以我就想有没有这样一个办法,将一个数字字符串转为任何我想要的数字格式,JavaScript的字符串、数字处理的相关方法想了一遍,貌似都不支持这种处理(支持处理为整数或者浮点数,支持进一位、四舍五入或者截取为任意位数)
思考后写了以下的处理方法,如有不妥,还请指正
/*** @param {string|number} num 要处理的数字字符串或者数字本身* @param {number} decimalPlace 要保留的小数位数* @param {number} 处理数据类型 1 向上取整 2 向下取整 默认四舍五入* @returns {string} 返回处理后的数字字符串*/function getFixVal(num, decimalPlace, dealState) { // 若传入的不是数字格式,则不处理 if (isNaN(parseFloat(num))) { return false; } let sNum = num + ''; const idx = sNum.indexOf('.'); // 若处理的数据类型为默认的四舍五入,则直接取用toFixed函数的处理结果 if (!dealState || (dealState != 1 && dealState != 2) || idx === -1) { return parseFloat(num).toFixed(decimalPlace); } const arrNum = sNum.split('.'); let decimalNum = arrNum[1]; // 获取小数位的数字 let integerPart = arrNum[0]; // 若要求的小数位数大于0,则返回整数部分加上处理之后的小数部分,否则返回整数. if (decimalPlace > 0) { let isAdd = false; // 向上取整是否需要进一位 // 若小数位数字位数已经大于要保留的位数,则做以下处理 if (decimalNum.length > decimalPlace) { let front = decimalNum.substring(0, decimalPlace); let end = decimalNum.substring(decimalPlace, decimalPlace + 1); // 若向上取整,则小数点后数字在原有基础上加1 switch (dealState) { case 1: if (parseInt(end) > 0) { let temp = (parseInt(front) + 1) / Math.pow(10, decimalPlace); // 若无需进位,如98 + 1 = 99 99 / 100 = 0.99,则截取小数点后两位 if (temp < 1) { decimalNum = (temp + '').substring(2, decimalPlace + 2); if (decimalNum.length < decimalPlace) decimalNum = decimalNum.padEnd(decimalPlace, '0'); } else { decimalNum = ''.padEnd(decimalPlace, '0'); isAdd = true; } } break; default: decimalNum = front; } } else { decimalNum = decimalNum.padEnd(decimalPlace, '0') } if (isAdd) integerPart = parseInt(integerPart) + 1; return integerPart + '.' + decimalNum.substring(0, decimalPlace); // 再次substring是因为有精度问题 } else { // 若要求处理为整数,做以下处理 switch (dealState) { case 1: sNum = Math.ceil(num) + ''; break; default: sNum = Math.floor(num) + ''; } return sNum; }}复制代码