- 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
|