|
- import NAMES from '../../names.json'
- import ones from './ones'
- import tens from './tens'
- import hundreds from './hundreds'
-
- interface CombiningPrefix {
- (kiloHundreds: number, kiloTens: number, kiloOnes: number, kiloPower?: number): string
- }
-
- const combiningPrefix: CombiningPrefix = (kiloHundredsRaw, kiloTens, kiloOnes, kiloPower = 0) => {
- let kiloHundreds = kiloHundredsRaw
- let prefix = ''
-
- const isMillia = kiloHundredsRaw >= 10
- if (isMillia) {
- prefix += combiningPrefix(
- Math.floor(kiloHundredsRaw / 1000),
- Math.floor((kiloHundredsRaw / 100) % 10),
- Math.floor((kiloHundredsRaw / 10) % 10),
- kiloPower + 1,
- )
- kiloHundreds = kiloHundredsRaw % 10
- }
-
- const hasHundreds = kiloHundreds > 0
- if (hasHundreds) {
- prefix += hundreds(kiloHundreds)
- }
-
- if (
- kiloPower > 0 &&
- ((kiloHundreds === 0 && kiloTens === 0 && kiloOnes > 1) ||
- ((kiloHundreds > 0 || kiloTens > 0) && kiloOnes > 0) ||
- (kiloHundreds === 0 && kiloTens === 0 && kiloOnes === 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 === 0 && kiloOnes > 0) {
- const special = kiloHundreds === 0 && kiloTens === 0
- prefix += ones(kiloOnes, special)
- if (special && [5, 6].includes(kiloOnes)) {
- prefix += 't'
- }
- }
- if (kiloTens > 0) {
- prefix += tens(kiloTens)
- }
-
- if (kiloPower > 0) {
- if (!(kiloHundreds === 0 && kiloTens === 0 && kiloOnes === 0)) {
- for (let p = 0; p < kiloPower; p += 1) {
- prefix += NAMES.kiloThousand
- }
- }
- return prefix
- }
-
- if ((kiloHundreds === 0 && kiloTens > 1) || (kiloHundreds > 0 && kiloTens !== 1) || kiloHundredsRaw >= 10) {
- prefix += 't'
- }
- return prefix + 'i'
- }
-
- export default combiningPrefix
|