Get the name of a number, even if it's stupidly big.
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
Este repositório está arquivado. Pode ver ficheiros e cloná-lo, mas não pode fazer envios ou lançar questões ou pedidos de integração.

78 linhas
2.2 KiB

  1. import { Digit } from '../../../../common'
  2. import NAMES from '../../names'
  3. import ones from './ones'
  4. import tens from './tens'
  5. import hundreds from './hundreds'
  6. interface CombiningPrefix {
  7. (kiloHundreds: bigint, kiloTens: Digit, kiloOnes: Digit, kiloPower?: bigint): string
  8. }
  9. const combiningPrefix: CombiningPrefix = (kiloHundreds, kiloTens, kiloOnes, kiloPower = 0n) => {
  10. let currentKiloHundreds = kiloHundreds
  11. let prefix = ''
  12. const isMillia = kiloHundreds >= 10n
  13. if (isMillia) {
  14. prefix += combiningPrefix(
  15. kiloHundreds / 1000n,
  16. (Number(kiloHundreds / 100n) % 10) as Digit,
  17. (Number(kiloHundreds / 10n) % 10) as Digit,
  18. kiloPower + 1n,
  19. )
  20. currentKiloHundreds = kiloHundreds % 10n
  21. }
  22. const hasHundreds = currentKiloHundreds > 0n
  23. if (hasHundreds) {
  24. prefix += hundreds(Number(currentKiloHundreds % 10n) as Digit)
  25. }
  26. const kiloTensNumber = Number(kiloTens)
  27. const kiloOnesNumber = Number(kiloOnes)
  28. if (
  29. kiloPower > 0 &&
  30. ((currentKiloHundreds === 0n && kiloTensNumber === 0 && kiloOnesNumber > 1) ||
  31. ((currentKiloHundreds > 0n || kiloTensNumber > 0) && kiloOnesNumber > 0) ||
  32. (currentKiloHundreds === 0n &&
  33. kiloTensNumber === 0 &&
  34. kiloOnesNumber === 1 &&
  35. prefix.endsWith(NAMES.kiloThousand)))
  36. ) {
  37. // http://www.isthe.com/chongo/tech/math/number/howhigh.html
  38. // Section: Titanic size numbers < 10^3000003
  39. prefix += ones(kiloOnes, false)
  40. }
  41. if (kiloPower === 0n && kiloOnesNumber) {
  42. const special = currentKiloHundreds === 0n && kiloTensNumber === 0
  43. prefix += ones(kiloOnes, special)
  44. if (special && [5, 6].includes(Number(kiloOnes))) {
  45. prefix += 't'
  46. }
  47. }
  48. if (kiloTensNumber > 0) {
  49. prefix += tens(kiloTens)
  50. }
  51. if (kiloPower > 0n) {
  52. if (!(currentKiloHundreds === 0n && kiloTensNumber === 0 && kiloOnesNumber === 0)) {
  53. for (let p = 0n; p < kiloPower; p += 1n) {
  54. prefix += NAMES.kiloThousand
  55. }
  56. }
  57. return prefix
  58. }
  59. if (
  60. (currentKiloHundreds === 0n && kiloTensNumber > 1) ||
  61. (currentKiloHundreds > 0n && kiloTensNumber !== 1) ||
  62. (kiloHundreds >= 10n && kiloTensNumber !== 1)
  63. ) {
  64. prefix += 't'
  65. }
  66. return prefix + 'i'
  67. }
  68. export default combiningPrefix