最近开发项目遇到把普通数字转换成带逗号数字的需求, 现在分享一种思路, 供大家参考
注意: 入参应为纯数字或数字类型字符串
思路: 在开发前需要确定数字的位数, 根据不同情况改造
先使用includes方法判断数字为整数还是小数
整数思路
整数会出现的数字: 1 | 12 | 123 | 1234 | 12345 | 123456 | 1234567
- 确定数字长度: 将数字转换成字符串取长度
- 当数字长度 <= 3 不需要添加逗号,直接输出原数字
- 当数字长度 > 3 数字进行添加逗号的改造:
- 情况一 : 第一个逗号前是小于3位的数
使用数字长度 % 3 取余, 如果结果不是0 说明第一个逗号前有小于三位的数字 例如 1234, 余数用于单独获取第一个逗号左右的数字.
获取到第一个逗号右侧的数字后, 判断右侧数字位数, 分为三位数 和大于三位数 例如 123 | 123123, 如果右侧数字只有3位,那么返回第一个逗号左侧的数 + ',' + 逗号右侧数;
如果右侧数字多于3位,需要在右侧数字内添加逗号,方法:
- 最终返回数 = 左侧数字
- 获取右侧数字长度
- 长度 / 3 获得循环次数
- 根据循环次数每次取三位数: 例如 123456 会循环两次, 第一次取123 第二次456, 将每次循环的数字追加到一个新的数组中
- 得到了数组, 使用map, 每拿一项就改变一次最终返回数 最终返回数 = 最终返回数 + ',' + 该项的值
===============
- 情况二 : 第一个逗号前不是小于3位的数
使用数字长度 % 3 取余, 如果结果是0 说明第一个逗号前没有小于三位的数字, 例如 123 | 123123, 这种情况只需要将数字用上面的方法以3位为一组拆开, 最终使用逗号拼接, 需要注意的是拼接的数字最终会出现 ,123,123的情况, 需要清除字符串的第一位
小数思路
小数会出现的数字: 1.1 | 12.1 | 123.1 | 1234.1 | 12345.1 | 123456.1 | 1234567.1
- 首先和使用 . 将小数拆分, 拿整数位操作
- 整体思路和整数一样
- 需要注意的是最终的值要加上 '.' 与 小数位
具体代码如下
setNumSty (num) {
const numString = num + ''
const LEN = numString.length
let integer = ''
let decimal = ''
let numArr = []
var returnNum = '' // 添加逗号后最终数字
// 先判断是否为小数
if (numString.includes('.')) {
// 小数
numArr = numString.split('.') // 从小数点切割数字
integer = numArr[0] + '' // 整数部分
decimal = numArr[1] + '' // 小数部分
const len = integer.length // 整数位数
let n1 = ''
let n2 = ''
if (len <= 3) { // 整数位不携带逗号
returnNum = num
}
if (len > 3) { // 整数位携带逗号
if (len % 3 === 0) { // 第一个逗号前无小于3位数字
if (len / 3 === 1) { // 数字以3为一组拆分
returnNum = integer + '.' + decimal
} else {
n1 = integer + '' // 第一个逗号之前的数
if (n1.length === 3) { // 以三个数为一组添加逗号
returnNum = n1 + '.' + decimal
} else {
const threes = n1.length / 3
const n2 = []
for (let i = 0; i < threes; i++) {
n2.push(n1.slice(i * 3, i * 3 + 3))
}
n2.map(n => {
returnNum = returnNum + ',' + n
})
returnNum = (returnNum + '.' + decimal).substring(1)
}
}
} else { // 第一个逗号前有小于3位数字
n1 = integer.slice(0, len % 3) + '' // 第一个逗号之前的数
n2 = integer.slice(len % 3) + '' // 第一个逗号之后的数
if (n2.length === 3) { // 以三个数为一组添加逗号
returnNum = n1 + ',' + n2 + '.' + decimal
} else {
returnNum = n1
console.log('returnNum', returnNum)
const threes = n2.length / 3
const n3 = []
for (let i = 0; i < threes; i++) {
n3.push(n2.slice(i * 3, i * 3 + 3))
}
console.log('n3', n3)
n3.map(n => {
returnNum = returnNum + ',' + n
})
returnNum = returnNum + '.' + decimal
}
}
}
} else {
// 整数
if (LEN <= 3) {
returnNum = num
} else {
integer = numString
if (LEN % 3 === 0) { // 第一个逗号前无小于3位数字
const n1 = []
for (let i = 0; i < integer.length / 3; i++) {
n1.push(integer.slice(i * 3, i * 3 + 3))
}
n1.map(n => {
returnNum = returnNum + ',' + n
})
returnNum = returnNum.substring(1)
} else { // 第一个逗号前有小于3位数字
const n1 = numString.slice(0, LEN % 3) // 第一个逗号之前的数
const n2 = numString.slice(LEN % 3) + '' // 第一个逗号之后的数
returnNum = n1
if (n2.length <= 3) { // 第一个逗号后没有逗号
returnNum = n1 + ',' + n2
} else { // 第一个逗号后有逗号
const n3 = []
const len2 = n2.length / 3
for (let i = 0; i < len2; i++) { // 三位数为一组拆分
n3.push(n2.slice(i * 3, i * 3 + 3))
}
n3.map(n => {
returnNum = returnNum + ',' + n
})
}
}
}
}
return returnNum
}
调用时将要转换的数字作为入参传入setNumSty方法即可