npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

sprut-numeric-word

v0.0.2-beta.1

Published

Набор функций для перевод чисел в словесную форму и склонения числительных и имён объектов подсчёта

Downloads

9

Readme

> npm i sprut-numeric-word

Sprut-numeric-word

Набор функций для перевод чисел в словесную форму и склонения числительных и имён объектов подсчёта. Предлагает создавать словари в специальном формате для использования их предоставленными фукнциями как аргументами.


Экспортируются три функции: numericWord, numericWordWithPostfix и onlyPostfix. И четыре стандартных словаря для примера: Digits, Places, GrammDict и RubDict.


Оглавление

Использование 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мс