js超大数字格式化(整数、浮点数千分位格式化)

534 阅读1分钟

js超大数字格式化(整数、浮点数千分位格式化)

一、科学计数法转化成数字----exponentToNumber(number)

toExponential()方法

// 不传参数
var num = 2.13456; 
console.log(num.toExponential()); // 2.13456e+0
/**
 * @description 把有可能是科学技术法的数字转换为 数字字符串
 * @param {string | Number} num
 * @returns {string}
 * @example exponentToNumber(9.2e-7) --> 0.00000092
 */
export const exponentToNumber = (num) => {
	if (isNaN(num)) {
		console.warn(`exponentialToNum 转换失败: ${num} 参数非数字格式!`);
		return 0;
	}
	var m = Number(num).toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);
    // ['9.2e-7', '2', '-7', index: 0, input: '9.2e-7', groups: undefined]
	return Number(num).toFixed(Math.max(0, (m[1] || '').length - m[2]));
};

二、去掉小数位多余的0----clearzero(number)

/**
 * @description 去掉小数位多余的0
 * @param {String} number 要处理的数字字符串
 * @return {string}
 * @example clearzero(520.2100) --> '520.21'
 */
export const clearzero = (number) => {
	return `${number}`.replace(/(?:\.0*|(\.\d+?)0+)$/, '$1');
};

三、小数位处理 少则补0多则截取(包含了科学计数的处理)----zeroize(number, digits, isFill = true)

/**
 * @description 小数位处理 少则补0多则截取, 包含了科学计数的处理
 * @param {string} number 要处理的数字字符串
 * @param {string} digits 要保留的位数
 * @param {boolean} isFill 是否要自动补0 默认true
 * @return {string}
 * zeroize(12.3456,5,true) --> '12.34560'
 */
// 需用到上面的方法一
export const zeroize = (number, digits, isFill = true) => {
	if (isNaN(number)) {
		console.warn(`zeroize 转换失败: ${number} 参数非数字格式!`);
		return `0.${'0'.repeat(digits)}`;
	}
	let _number = exponentToNumber(number);// 转成正常的数字
    // 整数
	if (`${_number}`.indexOf('.') == -1) {
        // 整数需补零
		if (isFill) {
			return `${_number}.${'0'.repeat(digits)}`;
		}
		return _number;
	}
    // 非整数
	return `${_number}`.replace(/(\d+)\.(\d+)/, (all, $1, $2) => {
        // console.log(all,$1,$2) // 12.3456 12 3456
		const len = digits - $2.length;
		const point = len > 0 ? `${$2}${isFill ? '0'.repeat(len) : ''}` : $2.slice(0, digits);
		return `${$1}.${point}`;
	});
};

四、把数字转换为千分位分割----thousands(number, lang)

/**
 * @description 把数字转换为千分位分割
 * @param {string | Number } num 要转换的数字或数字字符串
 * @param {string } [lang] 要根据语言区分 分隔符, 例如 vi-VN 转换后  1.222.33,05
 * @returns {string}
 * @example thousands(1234567.89) --> 1,234,567.89
 */
export const thousands = (num, lang) => {
	let separator = [',', '.'];
	let _lang = lang || 'zh-CN'; // 默认中文
	if (_lang && _lang == 'vi-VN') { 
		separator.reverse();
	}
	var parts = num.toString().split('.');
	parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, separator[0]);
	return parts.join(separator[1]);
};

五、数据格式化(转换成万,亿等)

/** 
* @description 把数字转换为中文描述 (保留2位小数,向上取整)
* @param {Number } num 要转换的数字
* @returns {string} * @example numberUnitConver(10008952) --> '1000.90万'
*/
export const numberUnitConver = (value) => { 
    let param = {}; 
    let k = 10000, sizes = ['', '万', '亿', '万亿'], i; 
    if (value < k) { 
        param.value = value; 
        param.unit = ''; 
    } else { 
        i = Math.floor(Math.log(value) / Math.log(k)); 
        param.value = (value / Math.pow(k, i)).toFixed(2); 
        param.unit = sizes[i]; 
    } 
    return `${param.value}${param.unit}`; 
};