From add510b5c85e8455fe71fea81411a8ecc490c90f Mon Sep 17 00:00:00 2001 From: anotherpit Date: Thu, 31 Mar 2016 04:04:29 +0300 Subject: [PATCH] 1.0.0 --- .editorconfig | 13 + .gitignore | 103 +++++ .npmignore | 104 +++++ LICENSE.md | 9 + README.md | 102 +++++ index.js | 240 ++++++++++ package.json | 30 ++ test/index.spec.js | 1078 ++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 1679 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 index.js create mode 100644 package.json create mode 100644 test/index.spec.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..eb77e81 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[package.json] +indent_size = 2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e03d49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,103 @@ +# Created by .ignore support plugin (hsz.mobi) +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +### Node template +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git +node_modules +### OSX template +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..dd5e8f0 --- /dev/null +++ b/.npmignore @@ -0,0 +1,104 @@ +# Created by .ignore support plugin (hsz.mobi) +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +### Node template +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git +node_modules +### OSX template +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +test diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..e92aa5f --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License + +Copyright © 2016 anotherpit + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bd8804a --- /dev/null +++ b/README.md @@ -0,0 +1,102 @@ +# numeralize-ru + +Написание числительных на русском языке с учётом пола и падежа. + +# Установка + +``` +npm install --save numeralize-ru +``` + +# API + +`numeralize(number, [gender, [kase, [animate]]])` — возвращает числительное, соответствующее числу ++ `number` — число, для которого надо записать числительное; ++ `gender` - пол: + + `numeralize.GENDER_MASCULINE` - мужской (по умолчанию); + + `numeralize.GENDER_FEMININE` - женский; + + `numeralize.GENDER_NEUTER` - средний; ++ `kase` - падеж (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной): + + `numeralize.CASE_NOMINATIVE` - именительный (по умолчанию); + + `numeralize.CASE_GENITIVE` - родительный; + + `numeralize.CASE_DATIVE` - дательный; + + `numeralize.CASE_ACCUSATIVE` - винительный; + + `numeralize.CASE_INSTRUMENTAL` - творительный; + + `numeralize.CASE_PREPOSITIONAL` - предложный; ++ `animate` - являются ли перечисляемые предметы одушевлёнными (влияет на форму винительного падежа некоторых числительных) + +```javascript +const numeralize = require('numeralize); + +numeralize(5122981121); +// мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один' + +numeralize(5122981121, numeralize.GENDER_FEMININE); +// женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна' + +numeralize(5122981121, numeralize.GENDER_NEUTER); +// средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно' + +numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_NOMINATIVE); +// мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один' + +numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_GENITIVE); +// мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного' + +numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_DATIVE); +// мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному' + +numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_ACCUSATIVE); +// мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один' + +numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_ACCUSATIVE, true); +// мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного' + +numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_INSTRUMENTAL); +// мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним' + +numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_PREPOSITIONAL); +// мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном' +``` + +`numeralize.pluralize(number, one, two, five)` — выбирает нужную форму существительного в зависимости от количества ++ `number` – количество ++ `one` — форма существительного для одного предмета, например, _рубль_; ++ `two` — форма существительного для двух предметов, например, _рубля_; ++ `five` — форма существительного для пяти предметов, например, _рублей_; + +```javascript +const pluralize = require('numeralize).pluralize; + +pluralize(0, 'рубль', 'рубля', 'рублей'); +// 'рублей' + +pluralize(1, 'рубль', 'рубля', 'рублей'); +// 'рубль' + +pluralize(2, 'рубль', 'рубля', 'рублей'); +// 'рубля' + +pluralize(5, 'рубль', 'рубля', 'рублей'); +// 'рублей' + +pluralize(11, 'рубль', 'рубля', 'рублей'); +// 'рублей' + +pluralize(21, 'рубль', 'рубля', 'рублей'); +// 'рубль' + +pluralize(21, 'рубль', 'рубля', 'рублей'); +// 'рубля' +``` + + +# Roadmap + ++ Порядковые числительные (ordinal numerals): _первый_, _вторым_, _третьими_ и т.д. ++ Собирательные числительные (collective numerals): _трое_, _четверых_, _пятерыми_ и т.д. ++ Особые формы единственного и множественного числа: _одни сутки_, _два дня_, _пять суток_ и т.д. + +# См.также + ++ Подробно о склонении числительных в русском языке с примерами: http://numeralonline.ru/ diff --git a/index.js b/index.js new file mode 100644 index 0000000..7263b12 --- /dev/null +++ b/index.js @@ -0,0 +1,240 @@ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define([], factory); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.numeralize = factory(); + } +}(this, function() { + 'use strict'; + + /** + * Numeralize number + * @param {number} number Integer + * @param {number} [gender=numeralize.GENDER_MASCULINE] + * @param {number} [kase=numeralize.CASE_NOMINATIVE] + * @param {boolean} [animate=false] + * @returns {string} + */ + function numeralize(number, gender, kase, animate) { + // Normalize params + number = Math.abs(parseInt(number, 10)); + gender = gender || numeralize.GENDER_MASCULINE; + kase = kase || numeralize.CASE_NOMINATIVE; + animate = !!animate; + + // Collect chunks + var result = []; + + // Descend known powers of thousand + for (var l = LARGES.length, i = l; i >= 0; i--) { + var base = Math.pow(10, i * 3); + var current = Math.floor(number / base); + number = number % base; + + if (current) { + var words = i ? LARGES[i] : null; + var numeral = small(current, words ? words[0] : gender, kase, words ? false : animate); + if (numeral) { + result.push(numeral); + if (words) { + var plural = pluralize.apply(null, [current].concat(words[kase + 1])); + result.push(plural); + } + } + } + } + + // Zero + if (!result.length) { + return MINORS[0][kase]; + } + + // Return + return result.join(" "); + } + + /** + * Numeralize small number (< 1000) + * @private + * @param {number} number Non-negative integer < 1000 + * @param {number} gender + * @param {number} kase + * @param {boolean} animate + * @returns {string} + */ + function small(number, gender, kase, animate) { + // Zero + if (0 === number) { return ""; } + + // Collect chunks + var result = []; + + // Hundreds + var hundreds = Math.floor(number / 100); + if (HUNDREDS[hundreds]) { + result.push(HUNDREDS[hundreds][kase]); + } + + // Tens + var tens = Math.floor(number % 100 / 10); + if (TENS[tens]) { + result.push(TENS[tens][kase]); + } + + // Minors + var minors = number % 100; + if (minors >= MINORS.length) { + minors = number % 10; + } + if (minors) { + minors = MINORS[minors][kase]; + if ("string" !== typeof minors) { + minors = minors[gender]; + if ("string" !== typeof minors) { + minors = minors[animate ? 0 : 1]; + } + } + result.push(minors); + } + + // Return + return result.join(" "); + } + + /** + * Pluralize noun according to count + * @param {number} count Number of items + * @param {string} one E.g. «рубль» + * @param {string} two E.g. «рубля» + * @param {string} five E.g. «рублей» + * @returns {string} + */ + function pluralize(count, one, two, five) { + count = Math.floor(Math.abs(count)) % 100; + if (count > 10 && count < 20) { + return five; + } + count = count % 10; + if (1 === count) { return one; } + if (count >= 2 && count <= 4) { return two; } + return five; + } + + numeralize.GENDER_MASCULINE = 0; + numeralize.GENDER_FEMININE = 1; + numeralize.GENDER_NEUTER = 2; + + numeralize.CASE_NOMINATIVE = 0; + numeralize.CASE_GENITIVE = 1; + numeralize.CASE_DATIVE = 2; + numeralize.CASE_ACCUSATIVE = 3; + numeralize.CASE_INSTRUMENTAL = 4; + numeralize.CASE_PREPOSITIONAL = 5; + + numeralize.pluralize = pluralize; + + var MINORS = [ + ['ноль', 'нуля', 'нулю', 'ноль', 'нулём', 'нуле'], + [ + ['один', 'одна', 'одно'], + ['одного', 'одной', 'одного'], + ['одному', 'одной', 'одному'], + [['одного', 'один'], 'одну', 'одно'], + ['одним', 'одной', 'одним'], + ['одном', 'одной', 'одном'] + ], + [ + ['два', 'две', 'два'], + 'двух', + 'двум', + [['двух', 'два'], ['двух', 'две'], 'два'], + 'двумя', + 'двух' + ], + [ + 'три', + 'трёх', + 'трём', + [['трёх', 'три'], ['трёх', 'три'], 'три'], + 'тремя', + 'трёх' + ], + [ + 'четыре', + 'четырёх', + 'четырём', + [['четырёх', 'четыре'], ['четырёх', 'четыре'], 'четыре'], + 'четырьмя', + 'четырёх' + ], + ['пять', 'пяти', 'пяти', 'пять', 'пятью', 'пяти'], + ['шесть', 'шести', 'шести', 'шесть', 'шестью', 'шести'], + ['семь', 'семи', 'семи', 'семь', 'семью', 'семи'], + ['восемь', 'восьми', 'восьми', 'восемь', 'восемью', 'восьми'], + ['девять', 'девяти', 'девяти', 'девять', 'девятью', 'девяти'], + ['десять', 'десяти', 'десяти', 'десять', 'десятью', 'десяти'] + ].concat( + ['один', 'две', 'три', 'четыр', 'пят', 'шест', 'сем', 'восем', 'девят'].map(function(prefix) { + return ['надцать', 'надцати', 'надцати', 'надцать', 'надцатью', 'надцати'].map(function(suffix) { + return prefix + suffix; + }); + }) + ); + + var TENS = [ + false, + false, + ['двадцать', 'двадцати', 'двадцати', 'двадцать', 'двадцатью', 'двадцати'], + ['тридцать', 'тридцати', 'тридцати', 'тридцать', 'тридцатью', 'тридцати'], + ['сорок', 'сорока', 'сорока', 'сорок', 'сорока', 'сорока'], + ['пятьдесят', 'пятидесяти', 'пятидесяти', 'пятьдесят', 'пятьюдесятью', 'пятидесяти'], + ['шестьдесят', 'шестидесяти', 'шестидесяти', 'шестьдесят', 'шестьюдесятью', 'шестидесяти'], + ['семьдесят', 'семидесяти', 'семидесяти', 'семьдесят', 'семьюдесятью', 'семидесяти'], + ['восемьдесят', 'восьмидесяти', 'восьмидесяти', 'восемьдесят', 'восемьюдесятью', 'восьмидесяти'], + ['девяносто', 'девяноста', 'девяноста', 'девяносто', 'девяноста', 'девяноста'] + ]; + + var HUNDREDS = [ + false, + ['сто', 'ста', 'ста', 'сто', 'ста', 'ста'], + ['двести', 'двухсот', 'двумстам', 'двести', 'двумястами', 'двухстах'], + ['триста', 'трёхсот', 'трёмстам', 'триста', 'тремястами', 'трёхстах'], + ['четыреста', 'четырёхсот', 'четырёмстам', 'четыреста', 'четырьмястами', 'четырёхстах'], + ['пятьсот', 'пятисот', 'пятистам', 'пятьсот', 'пятьюстами', 'пятистах'], + ['шестьсот', 'шестисот', 'шестистам', 'шестьсот', 'шестьюстами', 'шестистах'], + ['семьсот', 'семисот', 'семистам', 'семьсот', 'семьюстами', 'семистах'], + ['восемьсот', 'восьмисот', 'восьмистам', 'восемьсот', 'восемьюстами', 'восьмистах'], + ['девятьсот', 'девятисот', 'девятистам', 'девятьсот', 'девятьюстами', 'девятистах'] + ]; + + var LARGES = [ + false, + [ + numeralize.GENDER_FEMININE, + ['тысяча', 'тысячи', 'тысяч'], + ['тысячи', 'тысяч', 'тысяч'], + ['тысяче', 'тысячам', 'тысячам'], + ['тысячу', 'тысячи', 'тысяч'], + ['тысячей', 'тысячами', 'тысячами'], + ['тысяче', 'тысячах', 'тысячах'] + ] + ].concat(['миллион', 'миллиард', 'триллион'].map(function(base) { + return [numeralize.GENDER_MASCULINE] + .concat([ + ['', 'а', 'ов'], + ['а', 'ов', 'ов'], + ['у', 'ам', 'ам'], + ['', 'а', 'ов'], + ['ом', 'ами', 'ами'], + ['е', 'ах', 'ах'] + ].map(function(kase) { + return kase.map(function(suffix) { + return base + suffix; + }); + })); + })); + + return numeralize; +})); diff --git a/package.json b/package.json new file mode 100644 index 0000000..a09b0a2 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "numeralize-ru", + "version": "1.0.0", + "description": "Russian numerals", + "main": "index.js", + "scripts": { + "test": "./node_modules/.bin/mocha", + "dev": "./node_modules/.bin/mocha --watch" + }, + "keywords": [ + "russian", + "language", + "number", + "numeral", + "cardinal", + "ordinal", + "collective", + "numeralize", + "ru" + ], + "author": "anotherpit ", + "license": "MIT", + "devDependencies": { + "mocha": "^2.4.5" + }, + "repository": { + "type": "git", + "url": "https://github.com/anotherpit/numeralize-ru.git" + } +} diff --git a/test/index.spec.js b/test/index.spec.js new file mode 100644 index 0000000..7b5358f --- /dev/null +++ b/test/index.spec.js @@ -0,0 +1,1078 @@ +const assert = require('assert'); +const numeralize = require('../index'); + +describe('numeralize', () => { + 'use strict'; + + const tests = [ + ['0 to 19 (minors)', + [1, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'один'], [false, 'один']], + ['CASE_GENITIVE', [true, 'одного'], [false, 'одного']], + ['CASE_DATIVE', [true, 'одному'], [false, 'одному']], + ['CASE_ACCUSATIVE', [true, 'одного'], [false, 'один']], + ['CASE_INSTRUMENTAL', [true, 'одним'], [false, 'одним']], + ['CASE_PREPOSITIONAL', [true, 'одном'], [false, 'одном']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'одна'], [false, 'одна']], + ['CASE_GENITIVE', [true, 'одной'], [false, 'одной']], + ['CASE_DATIVE', [true, 'одной'], [false, 'одной']], + ['CASE_ACCUSATIVE', [true, 'одну'], [false, 'одну']], + ['CASE_INSTRUMENTAL', [true, 'одной'], [false, 'одной']], + ['CASE_PREPOSITIONAL', [true, 'одной'], [false, 'одной']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'одно'], [false, 'одно']], + ['CASE_GENITIVE', [true, 'одного'], [false, 'одного']], + ['CASE_DATIVE', [true, 'одному'], [false, 'одному']], + ['CASE_ACCUSATIVE', [true, 'одно'], [false, 'одно']], + ['CASE_INSTRUMENTAL', [true, 'одним'], [false, 'одним']], + ['CASE_PREPOSITIONAL', [true, 'одном'], [false, 'одном']]]], + [2, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'два'], [false, 'два']], + ['CASE_GENITIVE', [true, 'двух'], [false, 'двух']], + ['CASE_DATIVE', [true, 'двум'], [false, 'двум']], + ['CASE_ACCUSATIVE', [true, 'двух'], [false, 'два']], + ['CASE_INSTRUMENTAL', [true, 'двумя'], [false, 'двумя']], + ['CASE_PREPOSITIONAL', [true, 'двух'], [false, 'двух']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'две'], [false, 'две']], + ['CASE_GENITIVE', [true, 'двух'], [false, 'двух']], + ['CASE_DATIVE', [true, 'двум'], [false, 'двум']], + ['CASE_ACCUSATIVE', [true, 'двух'], [false, 'две']], + ['CASE_INSTRUMENTAL', [true, 'двумя'], [false, 'двумя']], + ['CASE_PREPOSITIONAL', [true, 'двух'], [false, 'двух']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'два'], [false, 'два']], + ['CASE_GENITIVE', [true, 'двух'], [false, 'двух']], + ['CASE_DATIVE', [true, 'двум'], [false, 'двум']], + ['CASE_ACCUSATIVE', [true, 'два'], [false, 'два']], + ['CASE_INSTRUMENTAL', [true, 'двумя'], [false, 'двумя']], + ['CASE_PREPOSITIONAL', [true, 'двух'], [false, 'двух']]]], + [3, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'три'], [false, 'три']], + ['CASE_GENITIVE', [true, 'трёх'], [false, 'трёх']], + ['CASE_DATIVE', [true, 'трём'], [false, 'трём']], + ['CASE_ACCUSATIVE', [true, 'трёх'], [false, 'три']], + ['CASE_INSTRUMENTAL', [true, 'тремя'], [false, 'тремя']], + ['CASE_PREPOSITIONAL', [true, 'трёх'], [false, 'трёх']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'три'], [false, 'три']], + ['CASE_GENITIVE', [true, 'трёх'], [false, 'трёх']], + ['CASE_DATIVE', [true, 'трём'], [false, 'трём']], + ['CASE_ACCUSATIVE', [true, 'трёх'], [false, 'три']], + ['CASE_INSTRUMENTAL', [true, 'тремя'], [false, 'тремя']], + ['CASE_PREPOSITIONAL', [true, 'трёх'], [false, 'трёх']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'три'], [false, 'три']], + ['CASE_GENITIVE', [true, 'трёх'], [false, 'трёх']], + ['CASE_DATIVE', [true, 'трём'], [false, 'трём']], + ['CASE_ACCUSATIVE', [true, 'три'], [false, 'три']], + ['CASE_INSTRUMENTAL', [true, 'тремя'], [false, 'тремя']], + ['CASE_PREPOSITIONAL', [true, 'трёх'], [false, 'трёх']]]], + [4, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'четыре'], [false, 'четыре']], + ['CASE_GENITIVE', [true, 'четырёх'], [false, 'четырёх']], + ['CASE_DATIVE', [true, 'четырём'], [false, 'четырём']], + ['CASE_ACCUSATIVE', [true, 'четырёх'], [false, 'четыре']], + ['CASE_INSTRUMENTAL', + [true, 'четырьмя'], + [false, 'четырьмя']], + ['CASE_PREPOSITIONAL', + [true, 'четырёх'], + [false, 'четырёх']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'четыре'], [false, 'четыре']], + ['CASE_GENITIVE', [true, 'четырёх'], [false, 'четырёх']], + ['CASE_DATIVE', [true, 'четырём'], [false, 'четырём']], + ['CASE_ACCUSATIVE', [true, 'четырёх'], [false, 'четыре']], + ['CASE_INSTRUMENTAL', + [true, 'четырьмя'], + [false, 'четырьмя']], + ['CASE_PREPOSITIONAL', + [true, 'четырёх'], + [false, 'четырёх']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'четыре'], [false, 'четыре']], + ['CASE_GENITIVE', [true, 'четырёх'], [false, 'четырёх']], + ['CASE_DATIVE', [true, 'четырём'], [false, 'четырём']], + ['CASE_ACCUSATIVE', [true, 'четыре'], [false, 'четыре']], + ['CASE_INSTRUMENTAL', + [true, 'четырьмя'], + [false, 'четырьмя']], + ['CASE_PREPOSITIONAL', + [true, 'четырёх'], + [false, 'четырёх']]]], + [5, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'пять'], [false, 'пять']], + ['CASE_GENITIVE', [true, 'пяти'], [false, 'пяти']], + ['CASE_DATIVE', [true, 'пяти'], [false, 'пяти']], + ['CASE_ACCUSATIVE', [true, 'пять'], [false, 'пять']], + ['CASE_INSTRUMENTAL', [true, 'пятью'], [false, 'пятью']], + ['CASE_PREPOSITIONAL', [true, 'пяти'], [false, 'пяти']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'пять'], [false, 'пять']], + ['CASE_GENITIVE', [true, 'пяти'], [false, 'пяти']], + ['CASE_DATIVE', [true, 'пяти'], [false, 'пяти']], + ['CASE_ACCUSATIVE', [true, 'пять'], [false, 'пять']], + ['CASE_INSTRUMENTAL', [true, 'пятью'], [false, 'пятью']], + ['CASE_PREPOSITIONAL', [true, 'пяти'], [false, 'пяти']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'пять'], [false, 'пять']], + ['CASE_GENITIVE', [true, 'пяти'], [false, 'пяти']], + ['CASE_DATIVE', [true, 'пяти'], [false, 'пяти']], + ['CASE_ACCUSATIVE', [true, 'пять'], [false, 'пять']], + ['CASE_INSTRUMENTAL', [true, 'пятью'], [false, 'пятью']], + ['CASE_PREPOSITIONAL', [true, 'пяти'], [false, 'пяти']]]], + [6, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'шесть'], [false, 'шесть']], + ['CASE_GENITIVE', [true, 'шести'], [false, 'шести']], + ['CASE_DATIVE', [true, 'шести'], [false, 'шести']], + ['CASE_ACCUSATIVE', [true, 'шесть'], [false, 'шесть']], + ['CASE_INSTRUMENTAL', [true, 'шестью'], [false, 'шестью']], + ['CASE_PREPOSITIONAL', [true, 'шести'], [false, 'шести']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'шесть'], [false, 'шесть']], + ['CASE_GENITIVE', [true, 'шести'], [false, 'шести']], + ['CASE_DATIVE', [true, 'шести'], [false, 'шести']], + ['CASE_ACCUSATIVE', [true, 'шесть'], [false, 'шесть']], + ['CASE_INSTRUMENTAL', [true, 'шестью'], [false, 'шестью']], + ['CASE_PREPOSITIONAL', [true, 'шести'], [false, 'шести']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'шесть'], [false, 'шесть']], + ['CASE_GENITIVE', [true, 'шести'], [false, 'шести']], + ['CASE_DATIVE', [true, 'шести'], [false, 'шести']], + ['CASE_ACCUSATIVE', [true, 'шесть'], [false, 'шесть']], + ['CASE_INSTRUMENTAL', [true, 'шестью'], [false, 'шестью']], + ['CASE_PREPOSITIONAL', [true, 'шести'], [false, 'шести']]]], + [7, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'семь'], [false, 'семь']], + ['CASE_GENITIVE', [true, 'семи'], [false, 'семи']], + ['CASE_DATIVE', [true, 'семи'], [false, 'семи']], + ['CASE_ACCUSATIVE', [true, 'семь'], [false, 'семь']], + ['CASE_INSTRUMENTAL', [true, 'семью'], [false, 'семью']], + ['CASE_PREPOSITIONAL', [true, 'семи'], [false, 'семи']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'семь'], [false, 'семь']], + ['CASE_GENITIVE', [true, 'семи'], [false, 'семи']], + ['CASE_DATIVE', [true, 'семи'], [false, 'семи']], + ['CASE_ACCUSATIVE', [true, 'семь'], [false, 'семь']], + ['CASE_INSTRUMENTAL', [true, 'семью'], [false, 'семью']], + ['CASE_PREPOSITIONAL', [true, 'семи'], [false, 'семи']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'семь'], [false, 'семь']], + ['CASE_GENITIVE', [true, 'семи'], [false, 'семи']], + ['CASE_DATIVE', [true, 'семи'], [false, 'семи']], + ['CASE_ACCUSATIVE', [true, 'семь'], [false, 'семь']], + ['CASE_INSTRUMENTAL', [true, 'семью'], [false, 'семью']], + ['CASE_PREPOSITIONAL', [true, 'семи'], [false, 'семи']]]], + [8, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'восемь'], [false, 'восемь']], + ['CASE_GENITIVE', [true, 'восьми'], [false, 'восьми']], + ['CASE_DATIVE', [true, 'восьми'], [false, 'восьми']], + ['CASE_ACCUSATIVE', [true, 'восемь'], [false, 'восемь']], + ['CASE_INSTRUMENTAL', + [true, 'восемью'], + [false, 'восемью']], + ['CASE_PREPOSITIONAL', [true, 'восьми'], [false, 'восьми']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'восемь'], [false, 'восемь']], + ['CASE_GENITIVE', [true, 'восьми'], [false, 'восьми']], + ['CASE_DATIVE', [true, 'восьми'], [false, 'восьми']], + ['CASE_ACCUSATIVE', [true, 'восемь'], [false, 'восемь']], + ['CASE_INSTRUMENTAL', + [true, 'восемью'], + [false, 'восемью']], + ['CASE_PREPOSITIONAL', [true, 'восьми'], [false, 'восьми']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'восемь'], [false, 'восемь']], + ['CASE_GENITIVE', [true, 'восьми'], [false, 'восьми']], + ['CASE_DATIVE', [true, 'восьми'], [false, 'восьми']], + ['CASE_ACCUSATIVE', [true, 'восемь'], [false, 'восемь']], + ['CASE_INSTRUMENTAL', + [true, 'восемью'], + [false, 'восемью']], + ['CASE_PREPOSITIONAL', [true, 'восьми'], [false, 'восьми']]]], + [9, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'девять'], [false, 'девять']], + ['CASE_GENITIVE', [true, 'девяти'], [false, 'девяти']], + ['CASE_DATIVE', [true, 'девяти'], [false, 'девяти']], + ['CASE_ACCUSATIVE', [true, 'девять'], [false, 'девять']], + ['CASE_INSTRUMENTAL', + [true, 'девятью'], + [false, 'девятью']], + ['CASE_PREPOSITIONAL', [true, 'девяти'], [false, 'девяти']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'девять'], [false, 'девять']], + ['CASE_GENITIVE', [true, 'девяти'], [false, 'девяти']], + ['CASE_DATIVE', [true, 'девяти'], [false, 'девяти']], + ['CASE_ACCUSATIVE', [true, 'девять'], [false, 'девять']], + ['CASE_INSTRUMENTAL', + [true, 'девятью'], + [false, 'девятью']], + ['CASE_PREPOSITIONAL', [true, 'девяти'], [false, 'девяти']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'девять'], [false, 'девять']], + ['CASE_GENITIVE', [true, 'девяти'], [false, 'девяти']], + ['CASE_DATIVE', [true, 'девяти'], [false, 'девяти']], + ['CASE_ACCUSATIVE', [true, 'девять'], [false, 'девять']], + ['CASE_INSTRUMENTAL', + [true, 'девятью'], + [false, 'девятью']], + ['CASE_PREPOSITIONAL', [true, 'девяти'], [false, 'девяти']]]], + [10, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', [true, 'десять'], [false, 'десять']], + ['CASE_GENITIVE', [true, 'десяти'], [false, 'десяти']], + ['CASE_DATIVE', [true, 'десяти'], [false, 'десяти']], + ['CASE_ACCUSATIVE', [true, 'десять'], [false, 'десять']], + ['CASE_INSTRUMENTAL', + [true, 'десятью'], + [false, 'десятью']], + ['CASE_PREPOSITIONAL', [true, 'десяти'], [false, 'десяти']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', [true, 'десять'], [false, 'десять']], + ['CASE_GENITIVE', [true, 'десяти'], [false, 'десяти']], + ['CASE_DATIVE', [true, 'десяти'], [false, 'десяти']], + ['CASE_ACCUSATIVE', [true, 'десять'], [false, 'десять']], + ['CASE_INSTRUMENTAL', + [true, 'десятью'], + [false, 'десятью']], + ['CASE_PREPOSITIONAL', [true, 'десяти'], [false, 'десяти']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', [true, 'десять'], [false, 'десять']], + ['CASE_GENITIVE', [true, 'десяти'], [false, 'десяти']], + ['CASE_DATIVE', [true, 'десяти'], [false, 'десяти']], + ['CASE_ACCUSATIVE', [true, 'десять'], [false, 'десять']], + ['CASE_INSTRUMENTAL', + [true, 'десятью'], + [false, 'десятью']], + ['CASE_PREPOSITIONAL', [true, 'десяти'], [false, 'десяти']]]], + [11, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'одиннадцать'], + [false, 'одиннадцать']], + ['CASE_GENITIVE', + [true, 'одиннадцати'], + [false, 'одиннадцати']], + ['CASE_DATIVE', + [true, 'одиннадцати'], + [false, 'одиннадцати']], + ['CASE_ACCUSATIVE', + [true, 'одиннадцать'], + [false, 'одиннадцать']], + ['CASE_INSTRUMENTAL', + [true, 'одиннадцатью'], + [false, 'одиннадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'одиннадцати'], + [false, 'одиннадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'одиннадцать'], + [false, 'одиннадцать']], + ['CASE_GENITIVE', + [true, 'одиннадцати'], + [false, 'одиннадцати']], + ['CASE_DATIVE', + [true, 'одиннадцати'], + [false, 'одиннадцати']], + ['CASE_ACCUSATIVE', + [true, 'одиннадцать'], + [false, 'одиннадцать']], + ['CASE_INSTRUMENTAL', + [true, 'одиннадцатью'], + [false, 'одиннадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'одиннадцати'], + [false, 'одиннадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'одиннадцать'], + [false, 'одиннадцать']], + ['CASE_GENITIVE', + [true, 'одиннадцати'], + [false, 'одиннадцати']], + ['CASE_DATIVE', + [true, 'одиннадцати'], + [false, 'одиннадцати']], + ['CASE_ACCUSATIVE', + [true, 'одиннадцать'], + [false, 'одиннадцать']], + ['CASE_INSTRUMENTAL', + [true, 'одиннадцатью'], + [false, 'одиннадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'одиннадцати'], + [false, 'одиннадцати']]]], + [12, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'двенадцать'], + [false, 'двенадцать']], + ['CASE_GENITIVE', + [true, 'двенадцати'], + [false, 'двенадцати']], + ['CASE_DATIVE', + [true, 'двенадцати'], + [false, 'двенадцати']], + ['CASE_ACCUSATIVE', + [true, 'двенадцать'], + [false, 'двенадцать']], + ['CASE_INSTRUMENTAL', + [true, 'двенадцатью'], + [false, 'двенадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'двенадцати'], + [false, 'двенадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'двенадцать'], + [false, 'двенадцать']], + ['CASE_GENITIVE', + [true, 'двенадцати'], + [false, 'двенадцати']], + ['CASE_DATIVE', + [true, 'двенадцати'], + [false, 'двенадцати']], + ['CASE_ACCUSATIVE', + [true, 'двенадцать'], + [false, 'двенадцать']], + ['CASE_INSTRUMENTAL', + [true, 'двенадцатью'], + [false, 'двенадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'двенадцати'], + [false, 'двенадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'двенадцать'], + [false, 'двенадцать']], + ['CASE_GENITIVE', + [true, 'двенадцати'], + [false, 'двенадцати']], + ['CASE_DATIVE', + [true, 'двенадцати'], + [false, 'двенадцати']], + ['CASE_ACCUSATIVE', + [true, 'двенадцать'], + [false, 'двенадцать']], + ['CASE_INSTRUMENTAL', + [true, 'двенадцатью'], + [false, 'двенадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'двенадцати'], + [false, 'двенадцати']]]], + [13, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'тринадцать'], + [false, 'тринадцать']], + ['CASE_GENITIVE', + [true, 'тринадцати'], + [false, 'тринадцати']], + ['CASE_DATIVE', + [true, 'тринадцати'], + [false, 'тринадцати']], + ['CASE_ACCUSATIVE', + [true, 'тринадцать'], + [false, 'тринадцать']], + ['CASE_INSTRUMENTAL', + [true, 'тринадцатью'], + [false, 'тринадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'тринадцати'], + [false, 'тринадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'тринадцать'], + [false, 'тринадцать']], + ['CASE_GENITIVE', + [true, 'тринадцати'], + [false, 'тринадцати']], + ['CASE_DATIVE', + [true, 'тринадцати'], + [false, 'тринадцати']], + ['CASE_ACCUSATIVE', + [true, 'тринадцать'], + [false, 'тринадцать']], + ['CASE_INSTRUMENTAL', + [true, 'тринадцатью'], + [false, 'тринадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'тринадцати'], + [false, 'тринадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'тринадцать'], + [false, 'тринадцать']], + ['CASE_GENITIVE', + [true, 'тринадцати'], + [false, 'тринадцати']], + ['CASE_DATIVE', + [true, 'тринадцати'], + [false, 'тринадцати']], + ['CASE_ACCUSATIVE', + [true, 'тринадцать'], + [false, 'тринадцать']], + ['CASE_INSTRUMENTAL', + [true, 'тринадцатью'], + [false, 'тринадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'тринадцати'], + [false, 'тринадцати']]]], + [14, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'четырнадцать'], + [false, 'четырнадцать']], + ['CASE_GENITIVE', + [true, 'четырнадцати'], + [false, 'четырнадцати']], + ['CASE_DATIVE', + [true, 'четырнадцати'], + [false, 'четырнадцати']], + ['CASE_ACCUSATIVE', + [true, 'четырнадцать'], + [false, 'четырнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'четырнадцатью'], + [false, 'четырнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'четырнадцати'], + [false, 'четырнадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'четырнадцать'], + [false, 'четырнадцать']], + ['CASE_GENITIVE', + [true, 'четырнадцати'], + [false, 'четырнадцати']], + ['CASE_DATIVE', + [true, 'четырнадцати'], + [false, 'четырнадцати']], + ['CASE_ACCUSATIVE', + [true, 'четырнадцать'], + [false, 'четырнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'четырнадцатью'], + [false, 'четырнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'четырнадцати'], + [false, 'четырнадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'четырнадцать'], + [false, 'четырнадцать']], + ['CASE_GENITIVE', + [true, 'четырнадцати'], + [false, 'четырнадцати']], + ['CASE_DATIVE', + [true, 'четырнадцати'], + [false, 'четырнадцати']], + ['CASE_ACCUSATIVE', + [true, 'четырнадцать'], + [false, 'четырнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'четырнадцатью'], + [false, 'четырнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'четырнадцати'], + [false, 'четырнадцати']]]], + [15, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'пятнадцать'], + [false, 'пятнадцать']], + ['CASE_GENITIVE', + [true, 'пятнадцати'], + [false, 'пятнадцати']], + ['CASE_DATIVE', + [true, 'пятнадцати'], + [false, 'пятнадцати']], + ['CASE_ACCUSATIVE', + [true, 'пятнадцать'], + [false, 'пятнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'пятнадцатью'], + [false, 'пятнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'пятнадцати'], + [false, 'пятнадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'пятнадцать'], + [false, 'пятнадцать']], + ['CASE_GENITIVE', + [true, 'пятнадцати'], + [false, 'пятнадцати']], + ['CASE_DATIVE', + [true, 'пятнадцати'], + [false, 'пятнадцати']], + ['CASE_ACCUSATIVE', + [true, 'пятнадцать'], + [false, 'пятнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'пятнадцатью'], + [false, 'пятнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'пятнадцати'], + [false, 'пятнадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'пятнадцать'], + [false, 'пятнадцать']], + ['CASE_GENITIVE', + [true, 'пятнадцати'], + [false, 'пятнадцати']], + ['CASE_DATIVE', + [true, 'пятнадцати'], + [false, 'пятнадцати']], + ['CASE_ACCUSATIVE', + [true, 'пятнадцать'], + [false, 'пятнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'пятнадцатью'], + [false, 'пятнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'пятнадцати'], + [false, 'пятнадцати']]]], + [16, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'шестнадцать'], + [false, 'шестнадцать']], + ['CASE_GENITIVE', + [true, 'шестнадцати'], + [false, 'шестнадцати']], + ['CASE_DATIVE', + [true, 'шестнадцати'], + [false, 'шестнадцати']], + ['CASE_ACCUSATIVE', + [true, 'шестнадцать'], + [false, 'шестнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'шестнадцатью'], + [false, 'шестнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'шестнадцати'], + [false, 'шестнадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'шестнадцать'], + [false, 'шестнадцать']], + ['CASE_GENITIVE', + [true, 'шестнадцати'], + [false, 'шестнадцати']], + ['CASE_DATIVE', + [true, 'шестнадцати'], + [false, 'шестнадцати']], + ['CASE_ACCUSATIVE', + [true, 'шестнадцать'], + [false, 'шестнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'шестнадцатью'], + [false, 'шестнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'шестнадцати'], + [false, 'шестнадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'шестнадцать'], + [false, 'шестнадцать']], + ['CASE_GENITIVE', + [true, 'шестнадцати'], + [false, 'шестнадцати']], + ['CASE_DATIVE', + [true, 'шестнадцати'], + [false, 'шестнадцати']], + ['CASE_ACCUSATIVE', + [true, 'шестнадцать'], + [false, 'шестнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'шестнадцатью'], + [false, 'шестнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'шестнадцати'], + [false, 'шестнадцати']]]], + [17, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'семнадцать'], + [false, 'семнадцать']], + ['CASE_GENITIVE', + [true, 'семнадцати'], + [false, 'семнадцати']], + ['CASE_DATIVE', + [true, 'семнадцати'], + [false, 'семнадцати']], + ['CASE_ACCUSATIVE', + [true, 'семнадцать'], + [false, 'семнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'семнадцатью'], + [false, 'семнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'семнадцати'], + [false, 'семнадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'семнадцать'], + [false, 'семнадцать']], + ['CASE_GENITIVE', + [true, 'семнадцати'], + [false, 'семнадцати']], + ['CASE_DATIVE', + [true, 'семнадцати'], + [false, 'семнадцати']], + ['CASE_ACCUSATIVE', + [true, 'семнадцать'], + [false, 'семнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'семнадцатью'], + [false, 'семнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'семнадцати'], + [false, 'семнадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'семнадцать'], + [false, 'семнадцать']], + ['CASE_GENITIVE', + [true, 'семнадцати'], + [false, 'семнадцати']], + ['CASE_DATIVE', + [true, 'семнадцати'], + [false, 'семнадцати']], + ['CASE_ACCUSATIVE', + [true, 'семнадцать'], + [false, 'семнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'семнадцатью'], + [false, 'семнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'семнадцати'], + [false, 'семнадцати']]]], + [18, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'восемнадцать'], + [false, 'восемнадцать']], + ['CASE_GENITIVE', + [true, 'восемнадцати'], + [false, 'восемнадцати']], + ['CASE_DATIVE', + [true, 'восемнадцати'], + [false, 'восемнадцати']], + ['CASE_ACCUSATIVE', + [true, 'восемнадцать'], + [false, 'восемнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'восемнадцатью'], + [false, 'восемнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'восемнадцати'], + [false, 'восемнадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'восемнадцать'], + [false, 'восемнадцать']], + ['CASE_GENITIVE', + [true, 'восемнадцати'], + [false, 'восемнадцати']], + ['CASE_DATIVE', + [true, 'восемнадцати'], + [false, 'восемнадцати']], + ['CASE_ACCUSATIVE', + [true, 'восемнадцать'], + [false, 'восемнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'восемнадцатью'], + [false, 'восемнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'восемнадцати'], + [false, 'восемнадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'восемнадцать'], + [false, 'восемнадцать']], + ['CASE_GENITIVE', + [true, 'восемнадцати'], + [false, 'восемнадцати']], + ['CASE_DATIVE', + [true, 'восемнадцати'], + [false, 'восемнадцати']], + ['CASE_ACCUSATIVE', + [true, 'восемнадцать'], + [false, 'восемнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'восемнадцатью'], + [false, 'восемнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'восемнадцати'], + [false, 'восемнадцати']]]], + [19, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'девятнадцать'], + [false, 'девятнадцать']], + ['CASE_GENITIVE', + [true, 'девятнадцати'], + [false, 'девятнадцати']], + ['CASE_DATIVE', + [true, 'девятнадцати'], + [false, 'девятнадцати']], + ['CASE_ACCUSATIVE', + [true, 'девятнадцать'], + [false, 'девятнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'девятнадцатью'], + [false, 'девятнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'девятнадцати'], + [false, 'девятнадцати']]], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'девятнадцать'], + [false, 'девятнадцать']], + ['CASE_GENITIVE', + [true, 'девятнадцати'], + [false, 'девятнадцати']], + ['CASE_DATIVE', + [true, 'девятнадцати'], + [false, 'девятнадцати']], + ['CASE_ACCUSATIVE', + [true, 'девятнадцать'], + [false, 'девятнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'девятнадцатью'], + [false, 'девятнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'девятнадцати'], + [false, 'девятнадцати']]], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'девятнадцать'], + [false, 'девятнадцать']], + ['CASE_GENITIVE', + [true, 'девятнадцати'], + [false, 'девятнадцати']], + ['CASE_DATIVE', + [true, 'девятнадцати'], + [false, 'девятнадцати']], + ['CASE_ACCUSATIVE', + [true, 'девятнадцать'], + [false, 'девятнадцать']], + ['CASE_INSTRUMENTAL', + [true, 'девятнадцатью'], + [false, 'девятнадцатью']], + ['CASE_PREPOSITIONAL', + [true, 'девятнадцати'], + [false, 'девятнадцати']]]] + ], + ['10, 20,.. 90 (tens)'].concat( + [ + [20, 'двадцать', 'двадцати', 'двадцати', 'двадцать', 'двадцатью', 'двадцати'], + [30, 'тридцать', 'тридцати', 'тридцати', 'тридцать', 'тридцатью', 'тридцати'], + [40, 'сорок', 'сорока', 'сорока', 'сорок', 'сорока', 'сорока'], + [50, 'пятьдесят', 'пятидесяти', 'пятидесяти', 'пятьдесят', 'пятьюдесятью', 'пятидесяти'], + [60, 'шестьдесят', 'шестидесяти', 'шестидесяти', 'шестьдесят', 'шестьюдесятью', 'шестидесяти'], + [70, 'семьдесят', 'семидесяти', 'семидесяти', 'семьдесят', 'семьюдесятью', 'семидесяти'], + [80, 'восемьдесят', 'восьмидесяти', 'восьмидесяти', 'восемьдесят', 'восемьюдесятью', 'восьмидесяти'], + [90, 'девяносто', 'девяноста', 'девяноста', 'девяносто', 'девяноста', 'девяноста'] + ].map(ten => [ten.shift()].concat( + ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat( + [ + 'CASE_NOMINATIVE', + 'CASE_GENITIVE', + 'CASE_DATIVE', + 'CASE_ACCUSATIVE', + 'CASE_INSTRUMENTAL', + 'CASE_PREPOSITIONAL' + ].map((kase, i) => [kase, [true, ten[i]], [false, ten[i]]]) + )) + )) + ), + ['100, 200,.. 900 (hundreds)'].concat( + [ + [100, 'сто', 'ста', 'ста', 'сто', 'ста', 'ста'], + [200, 'двести', 'двухсот', 'двумстам', 'двести', 'двумястами', 'двухстах'], + [300, 'триста', 'трёхсот', 'трёмстам', 'триста', 'тремястами', 'трёхстах'], + [400, 'четыреста', 'четырёхсот', 'четырёмстам', 'четыреста', 'четырьмястами', 'четырёхстах'], + [500, 'пятьсот', 'пятисот', 'пятистам', 'пятьсот', 'пятьюстами', 'пятистах'], + [600, 'шестьсот', 'шестисот', 'шестистам', 'шестьсот', 'шестьюстами', 'шестистах'], + [700, 'семьсот', 'семисот', 'семистам', 'семьсот', 'семьюстами', 'семистах'], + [800, 'восемьсот', 'восьмисот', 'восьмистам', 'восемьсот', 'восемьюстами', 'восьмистах'], + [900, 'девятьсот', 'девятисот', 'девятистам', 'девятьсот', 'девятьюстами', 'девятистах'] + ].map(ten => [ten.shift()].concat( + ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat( + [ + 'CASE_NOMINATIVE', + 'CASE_GENITIVE', + 'CASE_DATIVE', + 'CASE_ACCUSATIVE', + 'CASE_INSTRUMENTAL', + 'CASE_PREPOSITIONAL' + ].map((kase, i) => [kase, [true, ten[i]], [false, ten[i]]]) + )) + )) + ), + ['1000'].concat( + [ + [1000, 'одна тысяча', 'одной тысячи', 'одной тысяче', 'одну тысячу', 'одной тысячей', 'одной тысяче'], + [2000, 'две тысячи', 'двух тысяч', 'двум тысячам', 'две тысячи', 'двумя тысячами', 'двух тысячах'], + [5000, 'пять тысяч', 'пяти тысяч', 'пяти тысячам', 'пять тысяч', 'пятью тысячами', 'пяти тысячах'] + ].map(item => [item.shift()].concat( + ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat( + [ + 'CASE_NOMINATIVE', + 'CASE_GENITIVE', + 'CASE_DATIVE', + 'CASE_ACCUSATIVE', + 'CASE_INSTRUMENTAL', + 'CASE_PREPOSITIONAL' + ].map((kase, i) => [kase, [true, item[i]], [false, item[i]]]) + )) + )) + ), + ['1000^2'].concat( + [ + [1000000, + 'один миллион', + 'одного миллиона', + 'одному миллиону', + 'один миллион', + 'одним миллионом', + 'одном миллионе' + ], + [2000000, + 'два миллиона', + 'двух миллионов', + 'двум миллионам', + 'два миллиона', + 'двумя миллионами', + 'двух миллионах' + ], + [5000000, + 'пять миллионов', + 'пяти миллионов', + 'пяти миллионам', + 'пять миллионов', + 'пятью миллионами', + 'пяти миллионах' + ] + ].map(item => [item.shift()].concat( + ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat( + [ + 'CASE_NOMINATIVE', + 'CASE_GENITIVE', + 'CASE_DATIVE', + 'CASE_ACCUSATIVE', + 'CASE_INSTRUMENTAL', + 'CASE_PREPOSITIONAL' + ].map((kase, i) => [kase, [true, item[i]], [false, item[i]]]) + )) + )) + ), + ['1000^3'].concat( + [ + [1000000000, + 'один миллиард', + 'одного миллиарда', + 'одному миллиарду', + 'один миллиард', + 'одним миллиардом', + 'одном миллиарде' + ], + [2000000000, + 'два миллиарда', + 'двух миллиардов', + 'двум миллиардам', + 'два миллиарда', + 'двумя миллиардами', + 'двух миллиардах' + ], + [5000000000, + 'пять миллиардов', + 'пяти миллиардов', + 'пяти миллиардам', + 'пять миллиардов', + 'пятью миллиардами', + 'пяти миллиардах' + ] + ].map(item => [item.shift()].concat( + ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat( + [ + 'CASE_NOMINATIVE', + 'CASE_GENITIVE', + 'CASE_DATIVE', + 'CASE_ACCUSATIVE', + 'CASE_INSTRUMENTAL', + 'CASE_PREPOSITIONAL' + ].map((kase, i) => [kase, [true, item[i]], [false, item[i]]]) + )) + )) + ), + ['1000^4'].concat( + [ + [1000000000000, + 'один триллион', + 'одного триллиона', + 'одному триллиону', + 'один триллион', + 'одним триллионом', + 'одном триллионе' + ], + [2000000000000, + 'два триллиона', + 'двух триллионов', + 'двум триллионам', + 'два триллиона', + 'двумя триллионами', + 'двух триллионах' + ], + [5000000000000, + 'пять триллионов', + 'пяти триллионов', + 'пяти триллионам', + 'пять триллионов', + 'пятью триллионами', + 'пяти триллионах' + ] + ].map(item => [item.shift()].concat( + ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat( + [ + 'CASE_NOMINATIVE', + 'CASE_GENITIVE', + 'CASE_DATIVE', + 'CASE_ACCUSATIVE', + 'CASE_INSTRUMENTAL', + 'CASE_PREPOSITIONAL' + ].map((kase, i) => [kase, [true, item[i]], [false, item[i]]]) + )) + )) + ), + ['misc', + [5122981121, + ['GENDER_MASCULINE', + ['CASE_NOMINATIVE', + [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'], + [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'] + ], + ['CASE_GENITIVE', + [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'], + [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'] + ], + ['CASE_DATIVE', + [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'], + [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'] + ], + ['CASE_ACCUSATIVE', + [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'], + [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'] + ], + ['CASE_INSTRUMENTAL', + [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'], + [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'] + ], + ['CASE_PREPOSITIONAL', + [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'], + [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'] + ] + ], + ['GENDER_FEMININE', + ['CASE_NOMINATIVE', + [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'], + [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'] + ], + ['CASE_GENITIVE', + [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одной'], + [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одной'] + ], + ['CASE_DATIVE', + [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одной'], + [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одной'] + ], + ['CASE_ACCUSATIVE', + [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одну'], + [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одну'] + ], + ['CASE_INSTRUMENTAL', + [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одной'], + [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одной'] + ], + ['CASE_PREPOSITIONAL', + [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одной'], + [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одной'] + ] + ], + ['GENDER_NEUTER', + ['CASE_NOMINATIVE', + [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'], + [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'] + ], + ['CASE_GENITIVE', + [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'], + [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'] + ], + ['CASE_DATIVE', + [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'], + [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'] + ], + ['CASE_ACCUSATIVE', + [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одно'], + [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одно'] + ], + ['CASE_INSTRUMENTAL', + [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'], + [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'] + ], + ['CASE_PREPOSITIONAL', + [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'], + [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'] + ] + ] + ] + ] + ]; + + tests.map(test => { + let title = test.shift(); + describe(title, () => { + test.map(test => { + let arg0 = test.shift(); + test.map(test => { + let arg1 = test.shift(); + test.map(test => { + let arg2 = test.shift(); + test.map(test => { + let arg3 = test.shift(); + const expected = test.shift(); + it(`(${arg0}, ${arg1}, ${arg2}, ${arg3}) → ${expected}`, () => { + assert.strictEqual( + numeralize( + arg0, + numeralize[arg1], + numeralize[arg2], + arg3 + ), + expected + ); + }); + }); + }); + }); + }); + }); + }); + +});