Gets the name of a number, even if it's stupidly big. Supersedes TheoryOfNekomata/number-name.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

94 regels
2.2 KiB

  1. import BigNumber from 'bignumber.js';
  2. import {BLANK_DIGIT} from '../../../utils/numeric';
  3. const config = {
  4. hundredName: 'hundert',
  5. hundredOrdinalName: 'hundertste',
  6. and: 'und',
  7. onesNames: ['zero', 'ein', 'zwei', 'drei', 'vier', 'fünf', 'sechs', 'sieben', 'acht', 'neun'],
  8. onesOrdinalNames: [
  9. 'nullth',
  10. 'zuerst',
  11. 'zweite',
  12. 'dritte',
  13. 'vierte',
  14. 'fünfte',
  15. 'sechste',
  16. 'siebte',
  17. 'achte',
  18. 'neunte',
  19. ],
  20. teensNames: [
  21. 'zehn',
  22. 'elf',
  23. 'zwölf',
  24. 'dreizehn',
  25. 'vierzehn',
  26. 'fünfzehn',
  27. 'sechzehn',
  28. 'siebzehn',
  29. 'achtzehn',
  30. 'neunzehn',
  31. ],
  32. teensOrdinalNames: [
  33. 'zehnte',
  34. 'elfte',
  35. 'zwölfte',
  36. 'dreizehnte',
  37. 'vierzehnte',
  38. 'fünfzehnte',
  39. 'sechzehnte',
  40. 'siebzehnte',
  41. 'achtzehnte',
  42. 'neunzehnte',
  43. ],
  44. tensNames: ['zero', 'zehn', 'zwanzig', 'dreißig', 'vierzig', 'fünfzig', 'sechzig', 'siebzig', 'achtzig', 'neunzig'],
  45. tensOrdinalNames: [
  46. 'nullth',
  47. 'zehnte',
  48. 'zwanzigste',
  49. 'dreißigste',
  50. 'vierzigste',
  51. 'fünfzigste',
  52. 'sechzigste',
  53. 'siebzigste',
  54. 'achtzigste',
  55. 'neunzigste',
  56. ],
  57. grouping: 3,
  58. };
  59. export const getGroupDigitsName = (digitsRaw: string, index: BigNumber, ordinal: boolean) => {
  60. const digits = digitsRaw.padStart(config.grouping, BLANK_DIGIT);
  61. const [hundreds, tens, ones] = digits.split('').map(s => Number(s));
  62. const names = [];
  63. if (hundreds !== 0) {
  64. names.push(config.onesNames[hundreds]);
  65. if (!ordinal || (tens > 0 || ones > 0)) {
  66. names.push(config.hundredName);
  67. }
  68. }
  69. if (tens === 1) {
  70. names.push(config.teensNames[ones]);
  71. } else if (tens > 1) {
  72. if (ones > 0) {
  73. names.push(config.onesNames[ones]);
  74. names.push(config.and);
  75. }
  76. names.push(config.tensNames[tens]);
  77. } else {
  78. if (hundreds === 0) {
  79. if (ones === 1 && index.gte(2)) {
  80. names.push(ordinal ? config.onesOrdinalNames[ones] : config.onesNames[ones] + 'e');
  81. } else {
  82. names.push(ordinal ? config.onesOrdinalNames[ones] : config.onesNames[ones]);
  83. }
  84. } else if (ones > 0) {
  85. names.push(ordinal ? config.onesOrdinalNames[ones] : config.onesNames[ones]);
  86. } else if (ordinal) {
  87. names.push(config.hundredOrdinalName);
  88. }
  89. }
  90. return names.join('');
  91. };