// 支持负数
export function formatMoney(money, NaNToZero = true) {
const t = parseFloat(money)
if (isNaN(t)) {
return NaNToZero ? '0.00' : ''
}
// 转化成每隔3个加个逗号的形式,要支持负数, 只保留两位小数
return t.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
}
export function formatMoneyToChinese(money) {
// 将金额转化成中文大写的形式
let t = parseFloat(money)
if (isNaN(t)) {
return ''
}
const fraction = ['角', '分']
const digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
const unit = [
['元', '万', '亿'],
['', '拾', '佰', '仟'],
]
const head = t < 0 ? '欠' : ''
t = Math.abs(t)
let s = ''
for (let i = 0; i < fraction.length; i++) {
s += (
digit[Math.floor(t * 10 * Math.pow(10, i)) % 10] + fraction[i]
).replace(/零./, '')
}
s = s || '整'
t = Math.floor(t)
for (let i = 0; i < unit[0].length && t > 0; i++) {
let p = ''
for (let j = 0; j < unit[1].length && t > 0; j++) {
p = digit[t % 10] + unit[1][j] + p
t = Math.floor(t / 10)
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s
}
return (
head +
s
.replace(/(零.)*零元/, '元')
.replace(/(零.)+/g, '零')
.replace(/^整$/, '零元整')
)
}
export function changeImageUrlToSecure(url) {
if (!url) return url
if (typeof url !== 'string') {
console.error('url must be string ' + url)
return url
}
if (url.startsWith('http://meyoung')) {
return url.replace('http', 'https')
}
return url
}
export function hidePhone(phone) {
if (!phone) return phone
return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
}
export function hideBankCard(card) {
if (!card) return card
if (card.length === 16) {
return card.replace(/(\d{4})\d+(\d{4})/, '$1 **** **** $2')
} else if (card.length === 19) {
return card.replace(/(\d{4})\d+(\d{3})/, '$1 **** **** **** $2')
}
}
export function createOptions(data, map) {
if (!data || data.length === 0) {
return []
}
let id = 'id'
let text = 'text'
if (typeof map === 'function') {
return data.map(map)
}
if (map) {
if (map.id) {
id = map.id
}
if (map.text) {
text = map.text
}
}
return data.map((v) => ({
id: v[id],
text: v[text],
raw: v,
}))
}
export function getPrice(price) {
if (!price) return '0.00'
const n = Number(price)
if (isNaN(n)) return '0.00'
return n.toFixed(2)
}
// 价格转化成数字, 保留两位小数
export function getPriceNumber(price) {
if (!price) return 0.00
const n = Number(price)
if (isNaN(n)) return 0.00
return Math.round(n * 100) / 100 // 使用 Math.round 来减少精度问题
}
export function formatPrice(price = '') {
if (typeof price !== 'string') {
price = '' + price
}
const arr = String.prototype.toString.call(price).split('.')
if (arr.length === 1) {
return price
} else {
return arr[0] + '.' + arr[1].substring(0, 2)
}
}
export function sum(a, b) {
let c, d, e
try {
c = a.toString().split('.')[1].length
} catch (e) {
c = 0
}
try {
d = b.toString().split('.')[1].length
} catch (e) {
d = 0
}
e = Math.pow(10, Math.max(c, d))
return (mul(a, e) + mul(b, e)) / e
}
export function mul(a, b) {
let c = 0
const d = a.toString()
const e = b.toString()
try {
c += d.split('.')[1].length
} catch (f) { }
try {
c += e.split('.')[1].length
} catch (f) { }
return (
(Number(d.replace('.', '')) * Number(e.replace('.', ''))) / Math.pow(10, c)
)
}
// 将金额转化成 x 万元的形式
export function formatPriceToWan(price) {
if (!price) return '0 万元'
const n = Number(price)
if (isNaN(n)) return '0 万元'
return (n / 10000).toFixed(2) + ' 万元'
}
/**
* @function 保留小数点两位的金额
* @param { String | Number } money 输入金额
* @returns { String } 处理过保留小数点的金额
* */
export function keepTwoNumber(money) {
if (money === '') return ''
money = `${money}` // 容错处理
const yuan = money.split('.')[0] // 元
const jiao = money.split('.')[1] // 小数点后角分
if (money.indexOf('.') > -1) {
// 处理含有小数点的金额
return `${yuan}.${jiao.length >= 2 ? `${jiao.substring(0, 2)}` : `${jiao}0`}`
} else {
// 处理啊整数进度
return `${money}.00`
}
}
/**
* @function 保留小数点两位的金额并分割
* @param { String | Number } money 输入金额
* @returns { String } 处理过保留小数点的金额
* */
export const keepTwoNumberAndSplit = (money) => {
if (!money || !+money) return '0.00'
return keepTwoNumber(money).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
}
/**
* @function 金额计算
* @param {*} amount
* @param {*} decimalMultiplier
* @returns
*/
export const multiplyMoneyByDecimalCorrected = (amount, decimalMultiplier) => {
if (!amount || !decimalMultiplier) return '0.00'
// 将金额转换为分为单位
const amountInCents = Math.round(amount * 100)
// 将小数乘数也转换为对应的“百分”或“千分”等
const multiplierInCents = Math.round(decimalMultiplier * 100)
// 进行乘法运算
const resultInCents = amountInCents * multiplierInCents
// 转换回元并保留两位小数
const result = resultInCents / 10000
return result.toFixed(2) // 返回字符串形式的结果,保留两位小数
}
// * @function 中英文括号转换
// * @param {String} str
// */
export function formatBracket(str) {
return str.replace(/\(/g, '(').replace(/\)/g, ')')
}