// SPDX-FileCopyrightText: © 2024 LEDGER SAS // SPDX-License-Identifier: Apache-2.0 // Forked from @ledgerhq/live-currency-format/src/BigNumberToLocaleString.ts import { BigNumber } from 'bignumber.js' import { getSeparators } from './localeUtility' export type SupportedOptions = { minimumFractionDigits: number maximumFractionDigits: number useGrouping: boolean } const getFormatForLocale = (locale: string) => { const { decimal, thousands } = getSeparators(locale) const opts = { decimalSeparator: '.', groupSeparator: ',', groupSize: 3, secondaryGroupSize: 0, fractionGroupSeparator: '\xA0', // non-breaking space fractionGroupSize: 0, } if (typeof decimal === 'string') opts.decimalSeparator = decimal if (typeof thousands === 'string') opts.groupSeparator = thousands return opts } export const toLocaleString = ( n: BigNumber, localeInput?: string, options: Partial = {} ): string => { let locale = localeInput if (!locale) locale = 'en' const minimumFractionDigits = typeof options.minimumFractionDigits === 'number' ? options.minimumFractionDigits : 0 const maximumFractionDigits = typeof options.maximumFractionDigits === 'number' ? options.maximumFractionDigits : Math.max(minimumFractionDigits, 3) const useGrouping = 'useGrouping' in options ? options.useGrouping : true const format = getFormatForLocale(locale) if (!useGrouping) { format.groupSeparator = '' } const BN = BigNumber.clone({ FORMAT: format, }) const bn = new BN(n) const maxDecimals = bn.toFormat(maximumFractionDigits, BigNumber.ROUND_FLOOR) if (maximumFractionDigits !== minimumFractionDigits) { const minDecimals = bn.toFormat(minimumFractionDigits, BigNumber.ROUND_FLOOR) let i = maxDecimals.length while (i > minDecimals.length) { if (maxDecimals[i - 1] !== '0') { if (maxDecimals[i - 1] === format.decimalSeparator) { i-- } break } i-- } return maxDecimals.slice(0, i) } return maxDecimals }