Форматирование баланса криптовалют JS
Из бэкенда приходит баланс который может быть дробным или целым, вместе 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}`
}
Есть ли какой то более элегантный способ решения этой задачи?
Ответы (1 шт):
Автор решения: Алексей Р
→ Ссылка
Дробную часть форматируем с помощью метода 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)));