最近在做项目,前端涉及到金额转换,***分转元、元转分、转换为中文大写金额、格式化3位一个逗号***整理了一下,分享给大家!
/**
* 分转化为元 - 正则解决精度
* @param {Number} fen
*/
export const fenToYuan = (fen) => {
let num = fen
num = fen * 0.01
num += ''
const reg = num.indexOf('.') > -1 ? /(\d{1,3})(?=(?:\d{3})+\.)/g : /(\d{1,3})(?=(?:\d{3})+$)/g
num = num.replace(reg, '$1')
num = toDecimal2(num)
return num
}
/**
* 元转分 - 解决精度问题 yuan:要转换的钱,单位元; digit:转换倍数
* @param {Number} yuan
* @param {Number} digit
*/
export const yuanToFen = (yuan, digit) => {
let m = 0
const s1 = yuan.toString()
const s2 = digit.toString()
if (s1.indexOf('.') !== -1) {
m += s1.split('.')[1].length
}
if (s2.indexOf('.') !== -1) {
m += s2.split('.')[1].length
}
return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}
/**
* 判断是否最多两位小数,正负均可
* @param inputNumber
*/
export const checkTwoPointNum = (inputNumber) => {
const patten = /^-?\d+\.?\d{0,2}$/
return patten.test(inputNumber)
}
/**
* 强制保留2位小数,如:2,会在2后面补上00.即2.00
* @param x
*/
export const toDecimal2 = (x) => {
let f = parseFloat(x)
if (isNaN(f)) {
return false
}
f = Math.round(x * 100) / 100
var s = f.toString()
var rs = s.indexOf('.')
if (rs < 0) {
rs = s.length
s += '.'
}
while (s.length <= rs + 2) {
s += '0'
}
return s
}
/**
* 金额转为大写汉字
* @param money
*/
export const priceUppercase = (money) => {
// 汉字的数字
const cnNumbs = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
// 基本单位
const cnIntRadices = ['', '拾', '佰', '仟']
// 对应整数部分扩展单位
const cnIntUnits = ['', '万', '亿', '兆']
// 对应小数部分单位
const cnDecUnits = ['角', '分', '毫', '厘']
// var cnInteger = '整'; //整数金额时后面跟的字符
// 整型完以后的单位
let cnIntLast = '元'
// 最大处理的数字
const maxNum = 999999999999999.9999
// 额整数部分
let IntegerNum
// 金额小数部分
let DecimalNum
// 输出的中文金额字符串
let ChineseStr = ''
// 分离金额后用的数组,预定义
let parts
if (money === '') {
return ''
}
money = parseFloat(money)
if (money >= maxNum) {
// $.alert('超出最大处理数字');
return ''
}
if (money === 0) {
// ChineseStr = cnNumbs[0]+cnIntLast+cnInteger;
ChineseStr = cnNumbs[0] + cnIntLast
// document.getElementById('show').value=ChineseStr;
return ChineseStr
}
// 转换为字符串
money = money.toString()
if (money.indexOf('.') === -1) {
IntegerNum = money
DecimalNum = ''
cnIntLast = '元整'
} else {
parts = money.split('.')
IntegerNum = parts[0]
DecimalNum = parts[1].substr(0, 4)
}
let zeroCount = 0
let IntLen = 0
let n
let p
let m
let q
let decLen = 0
// 获取整型部分转换
if (parseInt(IntegerNum, 10) > 0) {
zeroCount = 0
IntLen = IntegerNum.length
for (var i = 0; i < IntLen; i++) {
n = IntegerNum.substr(i, 1)
p = IntLen - i - 1
q = p / 4
m = p % 4
if (n === '0') {
zeroCount++
} else {
if (zeroCount > 0) {
ChineseStr += cnNumbs[0]
}
// 归零
zeroCount = 0
ChineseStr += cnNumbs[parseInt(n)] + cnIntRadices[m]
}
if (m === 0 && zeroCount < 4) {
ChineseStr += cnIntUnits[q]
}
}
ChineseStr += cnIntLast
// 整型部分处理完毕
}
// 小数部分
if (DecimalNum !== '') {
decLen = DecimalNum.length
for (i = 0; i < decLen; i++) {
n = DecimalNum.substr(i, 1)
if (n !== '0') {
ChineseStr += cnNumbs[Number(n)] + cnDecUnits[i]
}
}
}
if (ChineseStr === '') {
// ChineseStr += cnNumbs[0]+cnIntLast+cnInteger;
ChineseStr += cnNumbs[0] + cnIntLast
}/* else if( DecimalNum == '' ){
ChineseStr += cnInteger;
ChineseStr += cnInteger;
} */
return ChineseStr
}
/**
* 格式化金钱,三位加一个逗号
* @param num
*/
export const priceToThousands = (num) => {
if (num) {
num = toDecimal2(num)
// 将num中的$,去掉,将num变成一个纯粹的数据格式字符串
num = num.toString().replace(/\$|\,/g, '')
// 如果num不是数字,则将num置0,并返回
if (num === '' || isNaN(num)) {
return 'Not a Number ! '
}
// 如果num是负数,则获取她的符号
const sign = num.indexOf('-') > 0 ? '-' : ''
// 如果存在小数点,则获取数字的小数部分
let cents = num.indexOf('.') > 0 ? num.substr(num.indexOf('.')) : ''
// 注意:这里如果是使用change方法不断的调用,小数是输入不了的
cents = cents.length > 1 ? cents : ''
// 获取数字的整数数部分
num = num.indexOf('.') > 0 ? num.substring(0, (num.indexOf('.'))) : num
// 如果没有小数点,整数部分不能以0开头
if (cents === '') {
if (num.length > 1 && num.substr(0, 1) === '0') {
return 'Not a Number ! '
}
} else {
// 如果有小数点,且整数的部分的长度大于1,则整数部分不能以0开头
if (num.length > 1 && num.substr(0, 1) === '0') {
return 'Not a Number ! '
}
}
// 针对整数部分进行格式化处理,这是此方法的核心,也是稍难理解的一个地方,逆向的来思考或者采用简单的事例来实现就容易多了
/*
也可以这样想象,现在有一串数字字符串在你面前,如果让你给他家千分位的逗号的话,你是怎么来思考和操作的?
字符串长度为0/1/2/3时都不用添加
字符串长度大于3的时候,从右往左数,有三位字符就加一个逗号,然后继续往前数,直到不到往前数少于三位字符为止
*/
for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3))
}
// 将数据(符号、整数部分、小数部分)整体组合返回
return (sign + num + cents)
}
// 以下是demo
// const fen = 1100
// fenToYuan(fen)
// const yuan = 110.12
// yuanToFen(yuan, 100) // 第二个参数是倍数,这里固定写100就行