最近项目中有这样需求,将一个数字字符串处理为需要的格式,比如:
var num = 0.431 // 处理为0.44
var 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;
}
}
复制代码