一些金额转换

// 支持负数
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, ')')
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值