import { Digit } from '../../../../common' import NAMES from '../../names' import ones from './ones' import tens from './tens' import hundreds from './hundreds' interface CombiningPrefix { (kiloHundreds: bigint, kiloTens: Digit, kiloOnes: Digit, kiloPower?: bigint): string } const combiningPrefix: CombiningPrefix = (kiloHundreds, kiloTens, kiloOnes, kiloPower = 0n) => { let currentKiloHundreds = kiloHundreds let prefix = '' const isMillia = kiloHundreds >= 10n if (isMillia) { prefix += combiningPrefix( kiloHundreds / 1000n, (Number(kiloHundreds / 100n) % 10) as Digit, (Number(kiloHundreds / 10n) % 10) as Digit, kiloPower + 1n, ) currentKiloHundreds = kiloHundreds % 10n } const hasHundreds = currentKiloHundreds > 0n if (hasHundreds) { prefix += hundreds(Number(currentKiloHundreds % 10n) as Digit) } const kiloTensNumber = Number(kiloTens) const kiloOnesNumber = Number(kiloOnes) if ( kiloPower > 0 && ((currentKiloHundreds === 0n && kiloTensNumber === 0 && kiloOnesNumber > 1) || ((currentKiloHundreds > 0n || kiloTensNumber > 0) && kiloOnesNumber > 0) || (currentKiloHundreds === 0n && kiloTensNumber === 0 && kiloOnesNumber === 1 && prefix.endsWith(NAMES.kiloThousand))) ) { // http://www.isthe.com/chongo/tech/math/number/howhigh.html // Section: Titanic size numbers < 10^3000003 prefix += ones(kiloOnes, false) } if (kiloPower === 0n && kiloOnesNumber) { const special = currentKiloHundreds === 0n && kiloTensNumber === 0 prefix += ones(kiloOnes, special) if (special && [5, 6].includes(Number(kiloOnes))) { prefix += 't' } } if (kiloTensNumber > 0) { prefix += tens(kiloTens) } if (kiloPower > 0n) { if (!(currentKiloHundreds === 0n && kiloTensNumber === 0 && kiloOnesNumber === 0)) { for (let p = 0n; p < kiloPower; p += 1n) { prefix += NAMES.kiloThousand } } return prefix } if ( (currentKiloHundreds === 0n && kiloTensNumber > 1) || (currentKiloHundreds > 0n && kiloTensNumber !== 1) || kiloHundreds >= 10 ) { prefix += 't' } return prefix + 'i' } export default combiningPrefix