Форматирование баланса криптовалют JS

Рейтинг: 0Ответов: 1Опубликовано: 10.03.2023

Из бэкенда приходит баланс который может быть дробным или целым, вместе c параметром decimal количество символов после точки, в целой части числа форматирование делит сотни пробелом, в дробной части добавляет нули если decimal > длины дробного числа или обрезает если decumal < дробной части числа вот мое решение:

    const formatCryptoBalance = (balance: number, decimal: number) => {
        const balanceStr = String(balance)
        let beforePoint = ''
        let afterPoint = ''
            
        if(balanceStr.indexOf('.') !== -1) {
            beforePoint = balanceStr.slice(0, balanceStr.indexOf('.'))
            afterPoint = balanceStr.slice(
                balanceStr.indexOf('.') + 1,
                balanceStr.length
            )
            if (afterPoint.length <= decimal) {
                for (let i = 0; i < decimal - afterPoint.length; i++) {
                    afterPoint += '0'
                }
            }
            if (afterPoint.length > decimal) {
                afterPoint = afterPoint.slice(0, decimal)
            }
        } else {
            beforePoint = String(balance)
            for (let i = 0; i < decimal; i++) {
                afterPoint += '0'
            }
        }
        if(beforePoint !== '0'){
            beforePoint = beforePoint.replace(/\B(?=(\d{3})+(?!\d))/g, ' ')
        }
    
        return `${beforePoint}.${afterPoint}`
}

Есть ли какой то более элегантный способ решения этой задачи?

Ответы

▲ 0

Дробную часть форматируем с помощью метода toFixed, затем расщепляем строку посимвольно, массив переворачиваем, ищем точку и расставляем пробелы после каждой второй цифры

const formatCryptoBalance = (balance, decimal) => {
  s = balance.toFixed(decimal).split('').reverse()
  i = s.indexOf(".") + 1
  out = s.slice(0, i)
  cnt = 0
  while (i < s.length) {
    out.push(s[i++])
    if (cnt++ % 3===2) out.push(" ")
  }
  return out.reverse().join("").trim();
}

[
  [1000, 0],
  [181548.17, 1],
  [12345.12, 4]
].forEach(([n, a]) => console.log(formatCryptoBalance(n, a)));

Вариант с использованием метода splice()

const formatCryptoBalance = (balance, decimal) => {
    let s = balance.toFixed(decimal).split('').reverse()
    let out = s.splice(0, s.indexOf(".") + 1)
    while (s.length) out.push(...s.splice(0, 3), " ")
    return out.reverse().join("").trim();
}

[[1000, 0], [181548.17, 1], [12345.12, 4]].forEach(([n, a]) => console.log(formatCryptoBalance(n, a)));