mango-v4-ui/utils/numbers.ts

149 lines
3.7 KiB
TypeScript
Raw Normal View History

import Decimal from 'decimal.js'
2022-07-05 20:37:49 -07:00
const digits2 = new Intl.NumberFormat('en', { maximumFractionDigits: 2 })
const digits6 = new Intl.NumberFormat('en', { maximumFractionDigits: 6 })
2022-08-23 15:33:09 -07:00
const digits8 = new Intl.NumberFormat('en', { maximumFractionDigits: 8 })
2022-07-05 20:37:49 -07:00
const digits9 = new Intl.NumberFormat('en', { maximumFractionDigits: 9 })
export const formatDecimal = (
value: number,
decimals: number = 6,
opts = { fixed: false }
2022-08-23 15:33:09 -07:00
): string => {
2022-07-05 20:37:49 -07:00
if (opts?.fixed) return value.toFixed(decimals)
2022-08-23 15:33:09 -07:00
if (value > -0.0000001 && value < 0.0000001) return '0.00'
2022-07-05 20:37:49 -07:00
if (decimals === 2) return digits2.format(value)
if (decimals === 6) return digits6.format(value)
2022-08-23 15:33:09 -07:00
if (decimals === 8) return digits8.format(value)
2022-07-05 20:37:49 -07:00
if (decimals === 9) return digits9.format(value)
2022-08-23 15:33:09 -07:00
return value.toString()
2022-07-05 20:37:49 -07:00
}
2022-07-10 19:01:16 -07:00
export const numberFormat = new Intl.NumberFormat('en', {
maximumSignificantDigits: 7,
})
2022-07-22 14:39:02 -07:00
export const floorToDecimal = (
value: number | string | Decimal,
decimals: number
): Decimal => {
const decimal: Decimal = !(value instanceof Decimal)
? new Decimal(value)
: value
return decimal.toDecimalPlaces(decimals, Decimal.ROUND_DOWN)
2022-08-02 11:04:00 -07:00
}
2022-08-13 22:07:53 -07:00
const usdFormatter0 = Intl.NumberFormat('en', {
minimumFractionDigits: 0,
maximumFractionDigits: 0,
style: 'currency',
currency: 'USD',
})
const usdFormatter2 = Intl.NumberFormat('en', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
style: 'currency',
currency: 'USD',
})
const usdFormatter4 = Intl.NumberFormat('en', {
minimumFractionDigits: 4,
maximumFractionDigits: 4,
style: 'currency',
currency: 'USD',
})
2022-08-11 19:27:36 -07:00
const numberFormatter0 = Intl.NumberFormat('en', {
minimumFractionDigits: 0,
maximumFractionDigits: 0,
})
2022-07-22 14:39:02 -07:00
const numberFormatter2 = Intl.NumberFormat('en', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
})
const numberFormatter4 = Intl.NumberFormat('en', {
minimumFractionDigits: 4,
maximumFractionDigits: 4,
})
const numberFormatter6 = Intl.NumberFormat('en', {
minimumFractionDigits: 6,
maximumFractionDigits: 6,
})
2022-08-23 15:33:09 -07:00
export const formatFixedDecimals = (
value: number,
2022-10-05 22:11:28 -07:00
isCurrency?: boolean,
isPercentage?: boolean
2022-08-23 15:33:09 -07:00
): string => {
let formattedValue
2022-08-01 12:23:29 -07:00
if (value === 0) {
2022-08-23 15:33:09 -07:00
formattedValue = isCurrency ? '$0.00' : '0'
2022-10-05 22:11:28 -07:00
} else if (isPercentage) {
formattedValue = Number(floorToDecimal(value, 2)).toLocaleString(
undefined,
{
maximumFractionDigits: 2,
}
)
2022-08-11 19:27:36 -07:00
} else if (value >= 1000) {
2022-08-23 15:33:09 -07:00
formattedValue = isCurrency
2022-08-13 22:07:53 -07:00
? usdFormatter0.format(value)
2022-10-05 22:11:28 -07:00
: Number(floorToDecimal(value, 0)).toLocaleString(undefined, {
maximumFractionDigits: 0,
})
2022-07-22 14:39:02 -07:00
} else if (value >= 1) {
2022-08-23 15:33:09 -07:00
formattedValue = isCurrency
2022-08-13 22:07:53 -07:00
? usdFormatter2.format(value)
2022-10-05 22:11:28 -07:00
: Number(floorToDecimal(value, 3)).toLocaleString(undefined, {
maximumFractionDigits: 3,
})
2022-07-22 14:39:02 -07:00
} else {
2022-08-23 15:33:09 -07:00
formattedValue = isCurrency
? usdFormatter2.format(value)
2022-10-05 22:11:28 -07:00
: Number(floorToDecimal(value, 4)).toLocaleString(undefined, {
maximumFractionDigits: 4,
})
2022-07-22 14:39:02 -07:00
}
2022-08-23 15:33:09 -07:00
if (formattedValue === '-$0.00') return '$0.00'
return formattedValue
2022-07-22 14:39:02 -07:00
}
2022-08-24 17:14:27 -07:00
export const countLeadingZeros = (x: number) => {
if (x % 1 == 0) {
return 0
} else {
return -1 - Math.floor(Math.log10(x % 1))
}
}
export const trimDecimals = (n: number, digits: number) => {
const step = Math.pow(10, digits || 0)
const temp = Math.trunc(step * n)
return temp / step
}
2022-09-13 23:24:26 -07:00
export const getDecimalCount = (value: number): number => {
if (
!isNaN(value) &&
Math.floor(value) !== value &&
value.toString().includes('.')
)
return value.toString().split('.')[1].length || 0
if (
!isNaN(value) &&
Math.floor(value) !== value &&
value.toString().includes('e')
)
return parseInt(value.toString().split('e-')[1] || '0')
return 0
}