sprut-numeric-word
v0.0.2-beta.1
Published
Набор функций для перевод чисел в словесную форму и склонения числительных и имён объектов подсчёта
Downloads
7
Maintainers
Readme
> npm i sprut-numeric-word
Sprut-numeric-word
Набор функций для перевод чисел в словесную форму и склонения числительных и имён объектов подсчёта. Предлагает создавать словари в специальном формате для использования их предоставленными фукнциями как аргументами.
Экспортируются три функции: numericWord
, numericWordWithPostfix
и onlyPostfix
.
И четыре стандартных словаря для примера: Digits
, Places
, GrammDict
и RubDict
.
Оглавление
- Использование numericWord
- Использование numericWordWithPostfix
- Использование onlyPostfix
- Словари
- Тесты и результаты
Использование numericWord:
Функция numericWord
переводит число в строку. По умолчанию используются словари на русском языке.
import { numericWord } from 'sprut-numeric-word';
console.log(numericWord(123));
// сто двадцать три
Использование numericWordWithPostfix:
Функция numericWordWithPostfix
переводит число в строку. По умолчанию используются словари на русском языке. Опционально можно последним аргументом использовать строку sexType
, которая должна быть согласована со словарями чисел. Для стандартного словаря это значения female
для женского рода и it
для среднего. Также в словарях склоняемых слов можно указать род sexType
, который по значению согласуется с родами, которые есть в словарях чисел. Так, например, в стандартном словаре GrammDict
для тонн указан род female
. Для килограммов и граммов не указан. Для них будут браться стандартные значения словаря чисел.
import { numericWordWithPostfix, GrammDict } from 'sprut-numeric-word';
console.log(numericWordWithPostfix(4332502582, GrammDict));
// четыре тысячи триста тридцать две тонны пятьсот два килограмма пятьсот восемьдесят два грамма
Использование onlyPostfix:
Функция onlyPostfix
склоняет слово из словарей относительно числа без вывода текстового представления числа.
Рекуомендуется использовать словари только с нулевым разрядом - без перевода в другие единицы измерения с более высокими разрядами. Иначе результат будет некорректным. Как, например, в стандартном словаре единиц массы есть и тонны и килограммы. И если запросить склонение для большого числа, больше 1000
, например, то получим склонённое слово уже в килограммах, а работющее со словом число будет 1000
. А нам это не нужно, так как мы выражаем именно граммы. Таким образом, если их склеить, получим тысячу килограммов, что неверно. Поэтому словари только с нулевым разрядом, чтобы всегда возращать граммы.
import { onlyPostfix, GrammDict } from 'sprut-numeric-word';
console.log(onlyPostfix(2, { 0: GrammDict[0] }));
// два грамма
Словари:
Есть три типа словарей: DigitDictionary
, PlaceDictionary
, WordDictionary
.
Пример DigitDictionary
:
export const Digits: DigitDictionary = {
0: {
0: 'ноль',
1: 'один',
2: 'два',
3: 'три',
4: 'четыре',
5: 'пять',
6: 'шесть',
7: 'семь',
8: 'восемь',
9: 'девять',
placeExceptions: {
3: {
1: 'одна',
2: 'две'
}
},
sexType: {
female: {
1: 'одна',
2: 'две'
},
it: {
1: 'одно',
2: 'два'
}
}
},
1: {
2: 'двадцать',
3: 'тридцать',
4: 'сорок',
5: 'пятьдесят',
6: 'шестьдесят',
7: 'семьдесят',
8: 'восемьдесят',
9: 'девяносто',
10: 'десять',
11: 'одиннадцать',
12: 'двенадцать',
13: 'тринадцать',
14: 'четырнадцать',
15: 'пятнадцать',
16: 'шестнадцать',
17: 'семнадцать',
18: 'восемнадцать',
19: 'девятнадцать'
},
2: {
1: 'сто',
2: 'двести',
3: 'триста',
4: 'четыреста',
5: 'пятьсот',
6: 'шестьсот',
7: 'семьсот',
8: 'восемьсот',
9: 'девятьсот'
}
};
Пример PlaceDictionary
:
{
3: {
2: 'тысячи',
1: 'тысяча',
3: 'тысячи',
4: 'тысячи',
11: 'тысяч',
12: 'тысяч',
13: 'тысяч',
14: 'тысяч',
defaultWord: 'тысяч'
},
6: {
2: 'миллиона',
1: 'миллион',
3: 'миллиона',
4: 'миллиона'
11: 'миллионов',
12: 'миллионов',
13: 'миллионов',
14: 'миллионов',
defaultWord: 'миллионов'
},
9: {
2: 'миллиарда',
1: 'миллиард',
3: 'миллиарда',
4: 'миллиарда'
11: 'миллиардов',
12: 'миллиардов',
13: 'миллиардов',
14: 'миллиардов',
defaultWord: 'миллиардов'
},
12: {
2: 'триллиона',
1: 'триллион',
3: 'триллиона',
4: 'триллиона'
11: 'триллионов',
12: 'триллионов',
13: 'триллионов',
14: 'триллионов',
defaultWord: 'триллионов'
}
}
Ключи-числа верхнего уровня обозначают порядковый индекс числа, который обозначает начало целевого разряда. Внутри значение по умолчанию и исключения для склонений слова.
Пример словаря единиц измерения массы WordDictionary
:
{
0: {
1: 'грамм',
2: 'грамма',
3: 'грамма',
4: 'грамма',
11: 'граммов',
12: 'граммов',
13: 'граммов',
14: 'граммов',
defaultWord: 'граммов'
},
3: {
1: 'килограмм',
2: 'килограмма',
3: 'килограмма',
4: 'килограмма',
11: 'килограммов',
12: 'килограммов',
13: 'килограммов',
14: 'килограммов',
defaultWord: 'килограммов'
},
6: {
1: 'тонна',
2: 'тонны',
3: 'тонны',
4: 'тонны',
11: 'тонн',
12: 'тонн',
13: 'тонн',
14: 'тонн',
defaultWord: 'тонн',
sexType: 'female'
}
}
Здесь также ключи-числа верхнего уровня обозначают порядковый индекс числа, который обозначает целевой разряд для обозначения других единиц измерения.Также словарь склонений слова может включать в себя свойство defaultBeforeUnion
и каждый из разрядов может включать beforeUnion
, чтобы перед разрядами вставлялся указанный союз. Но возможно это избыточно.
Такое деление на разные единицы измерения по разрядам подходит только для единиц, которые переводятся делением на числа, кратные десяти(10, 100, 1000 и т.д.). Небольшое упрощение для подобных массе. Но лучше переводить в другие единицы самостоятельно и использовать numericWordWithPostfix
с единственным подсловарём нулевого разхряда.
Тесты и результаты:
Тестирование numericWord
со словарём по умолчанию:
Результат для числа 0: "ноль"
Время выполнения: 0мс
Результат для числа 123: "сто двадцать три"
Время выполнения: 1мс
Результат для числа 23123: "двадцать три тысячи сто двадцать три"
Время выполнения: 0мс
Результат для числа 5000: "пять тысяч"
Время выполнения: 0мс
Результат для числа 113087: "сто тринадцать тысяч восемьдесят семь"
Время выполнения: 0мс
Результат для числа 2500587: "два миллиона пятьсот тысяч пятьсот восемьдесят семь"
Время выполнения: 0мс
Тестирование numericWordWithPostfix
со словарём единиц массы(число - количество граммов):
Результат для числа 4332502582(в граммах): "четыре тысячи триста тридцать две тонны пятьсот два килограмма пятьсот восемьдесят два грамма"
Время выполнения: 0мс
Результат для числа 0(в граммах): "ноль граммов"
Время выполнения: 0мс
Результат для числа 2000052(в граммах): "две тонны пятьдесят два грамма"
Время выполнения: 1мс
Результат для числа 2000000(в граммах): "две тонны"
Время выполнения: 0мс
Результат для числа 1000000(в граммах): "одна тонна"
Время выполнения: 0мс
Результат для числа 1000000000(в граммах): "одна тысяча тонн"
Время выполнения: 0мс
Результат для числа 2(в граммах): "два грамма"
Время выполнения: 0мс
Тестирование numericWordWithPostfix
с модифицированным словарём единиц массы с добавлением центнеров в пятом разряде(10 000 граммов - 1 центнер):
Результат для числа 4332512582(в граммах): "четыре тысячи триста тридцать две тонны пять центнеров двенадцать килограммов пятьсот восемьдесят два грамма"
Время выполнения: 0мс
Тестирование onlyPostfix
со словарём единиц массы(только граммы - GrammDict[0]
):
Результат для числа 1000: "граммов"
Время выполнения: 0мс
Результат для числа 2: "грамма"
Время выполнения: 0мс