mirror of
https://github.com/tenrok/numeralize-ru.git
synced 2026-06-14 18:42:34 +03:00
Rewrote how the lib is being built
This commit is contained in:
@@ -2,106 +2,148 @@
|
||||
|
||||
Написание числительных на русском языке с учётом пола и падежа.
|
||||
|
||||
# Установка
|
||||
## Использование в NodeJS
|
||||
|
||||
```
|
||||
npm install --save numeralize-ru
|
||||
```
|
||||
|
||||
# API
|
||||
```javascript
|
||||
import {numeralize, Case, Gender} from "numeralize-ru";
|
||||
|
||||
### `numeralize(number, [gender, [kase, [animate]]])`
|
||||
|
||||
Возвращает числительное, соответствующее числу
|
||||
|
||||
+ `number` — число, для которого надо записать числительное;
|
||||
+ `gender` — пол:
|
||||
+ `Gender.Masculine` — мужской (по умолчанию);
|
||||
+ `Gender.Feminine` — женский;
|
||||
+ `Gender.Neuter` — средний;
|
||||
+ `kase` — падеж (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
|
||||
+ `Case.Nominative` — именительный (по умолчанию);
|
||||
+ `Case.Genitive` — родительный;
|
||||
+ `Case.Dative` — дательный;
|
||||
+ `Case.Accusative` — винительный;
|
||||
+ `Case.Instrumental` — творительный;
|
||||
+ `Case.Prepositional` — предложный;
|
||||
+ `animate` — являются ли перечисляемые предметы одушевлёнными (влияет на форму винительного падежа некоторых числительных)
|
||||
|
||||
```typescript
|
||||
import {Case, Gender, numeralize, pluralize} from 'numeralize-ru';
|
||||
|
||||
numeralize(5122981121);
|
||||
// мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
|
||||
|
||||
numeralize(5122981121, Gender.Feminine);
|
||||
// женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
|
||||
|
||||
numeralize(5122981121, Gender.Neuter);
|
||||
// средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
|
||||
|
||||
numeralize(5122981121, Gender.Masculine, Case.Nominative);
|
||||
// мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
|
||||
|
||||
numeralize(5122981121, Gender.Masculine, Case.Genitive);
|
||||
// мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
|
||||
|
||||
numeralize(5122981121, Gender.Masculine, Case.Dative);
|
||||
// мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
|
||||
|
||||
numeralize(5122981121, Gender.Masculine, Case.Accusative);
|
||||
// мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
|
||||
|
||||
numeralize(5122981121, Gender.Masculine, Case.Accusative, true);
|
||||
// мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
|
||||
|
||||
numeralize(5122981121, Gender.Masculine, Case.Instrumental);
|
||||
// мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
|
||||
|
||||
numeralize(5122981121, Gender.Masculine, Case.Prepositional);
|
||||
// мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
|
||||
console.log(numeralize(5122981121, Gender.Masculine, Case.Nominative));
|
||||
```
|
||||
|
||||
### `pluralize(count, one, two, five)`
|
||||
## Использование с [дореволюционных](https://caniuse.com/?search=ESM) браузерах
|
||||
|
||||
Выбирает нужную форму существительного в зависимости от количества.
|
||||
|
||||
+ `count` — количество
|
||||
+ `one` — форма существительного для одного предмета, например, _рубль_;
|
||||
+ `two` — форма существительного для двух предметов, например, _рубля_;
|
||||
+ `five` — форма существительного для пяти предметов, например, _рублей_;
|
||||
|
||||
```typescript
|
||||
import {pluralize} from 'numeralize-ru';
|
||||
|
||||
pluralize(0, 'рубль', 'рубля', 'рублей');
|
||||
// 'рублей'
|
||||
|
||||
pluralize(1, 'рубль', 'рубля', 'рублей');
|
||||
// 'рубль'
|
||||
|
||||
pluralize(2, 'рубль', 'рубля', 'рублей');
|
||||
// 'рубля'
|
||||
|
||||
pluralize(5, 'рубль', 'рубля', 'рублей');
|
||||
// 'рублей'
|
||||
|
||||
pluralize(11, 'рубль', 'рубля', 'рублей');
|
||||
// 'рублей'
|
||||
|
||||
pluralize(21, 'рубль', 'рубля', 'рублей');
|
||||
// 'рубль'
|
||||
|
||||
pluralize(22, 'рубль', 'рубля', 'рублей');
|
||||
// 'рубля'
|
||||
```html
|
||||
<script src="https://unpkg.com/numeralize-ru/lib/index.browser.js"></script>
|
||||
<script>
|
||||
console.log(numeralize.numeralize(5122981121, numeralize.Gender.Feminine));
|
||||
</script>
|
||||
```
|
||||
|
||||
# Roadmap
|
||||
## API
|
||||
|
||||
+ Порядковые числительные (ordinal numerals): _первый_, _вторым_, _третьими_ и т.д.
|
||||
+ Собирательные числительные (collective numerals): _трое_, _четверых_, _пятерыми_ и т.д.
|
||||
+ Особые формы единственного и множественного числа: _одни сутки_, _два дня_, _пять суток_ и т.д.
|
||||
```typescript
|
||||
/**
|
||||
* Возвращает числительное, соответствующее числу
|
||||
*
|
||||
* @param {number} number Целое число, для которого надо записать числительное
|
||||
*
|
||||
* @param {Gender} [gender=Gender.Masculine] Пол:
|
||||
* - {@link Gender.Masculine} – мужской (по умолчанию);
|
||||
* - {@link Gender.Feminine} – женский;
|
||||
* - {@link Gender.Neuter} – средний.
|
||||
*
|
||||
* @param {Case} [kase=Case.Nominative] Падеж
|
||||
* (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
|
||||
* - {@link Case.Nominative} — именительный (по умолчанию);
|
||||
* - {@link Case.Genitive} — родительный;
|
||||
* - {@link Case.Dative} — дательный;
|
||||
* - {@link Case.Accusative} — винительный;
|
||||
* - {@link Case.Instrumental} — творительный;
|
||||
* - {@link Case.Prepositional} — предложный.
|
||||
*
|
||||
* @param {boolean} [animate=false] Являются ли перечисляемые предметы одушевлёнными
|
||||
* (влияет на форму винительного падежа некоторых числительных)
|
||||
*
|
||||
* @example
|
||||
* // мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
|
||||
* numeralize(5122981121);
|
||||
*
|
||||
* @example
|
||||
* // женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
|
||||
* numeralize(5122981121, Gender.Feminine);
|
||||
*
|
||||
* @example
|
||||
* // средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
|
||||
* numeralize(5122981121, Gender.Neuter);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Nominative);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Genitive);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Dative);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Accusative);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Accusative, true);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Instrumental);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Prepositional);
|
||||
*/
|
||||
declare function numeralize(
|
||||
number: number,
|
||||
gender: Gender = Gender.Masculine,
|
||||
kase: Case = Case.Nominative,
|
||||
animate: boolean = false
|
||||
): string;
|
||||
|
||||
# См.также
|
||||
/**
|
||||
* Выбирает нужную форму существительного в зависимости от количества.
|
||||
*
|
||||
* @param {number} count Количество
|
||||
* @param {string} one Форма существительного для одного предмета, например, «рубль»;
|
||||
* @param {string} two Форма существительного для двух предметов, например, «рубля»;
|
||||
* @param {string} five Форма существительного для пяти предмета, например, «рублей»;
|
||||
*
|
||||
* @example
|
||||
* // 'рублей'
|
||||
* pluralize(0, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рубль'
|
||||
* pluralize(1, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рубля'
|
||||
* pluralize(2, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рублей'
|
||||
* pluralize(5, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рублей'
|
||||
* pluralize(11, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рубль'
|
||||
* pluralize(21, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рубля'
|
||||
* pluralize(22, 'рубль', 'рубля', 'рублей');
|
||||
*/
|
||||
declare function pluralize(count: number, one: string, two: string, five: string): string
|
||||
```
|
||||
|
||||
## Спонсорство
|
||||
|
||||
[Стать первым спонсором проекта](https://github.com/sponsors/anotherpit)
|
||||
|
||||
## Roadmap
|
||||
|
||||
+ [ ] Порядковые числительные (ordinal numerals): _первый_, _вторым_, _третьими_ и т.д.
|
||||
+ [ ] Собирательные числительные (collective numerals): _трое_, _четверых_, _пятерыми_ и т.д.
|
||||
+ [ ] Особые формы единственного и множественного числа: _одни сутки_, _два дня_, _пять суток_ и т.д.
|
||||
|
||||
## См.также
|
||||
|
||||
+ Подробно о склонении числительных в русском языке с примерами: http://numeralonline.ru/
|
||||
|
||||
Generated
+392
-2
@@ -1,17 +1,18 @@
|
||||
{
|
||||
"name": "numeralize-ru",
|
||||
"version": "2.0.0",
|
||||
"version": "2.0.0-alpha.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "numeralize-ru",
|
||||
"version": "2.0.0",
|
||||
"version": "2.0.0-alpha.1",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/mocha": "^10.0.2",
|
||||
"@typescript-eslint/eslint-plugin": "^6.8.0",
|
||||
"@typescript-eslint/parser": "^6.8.0",
|
||||
"esbuild": "^0.19.5",
|
||||
"eslint": "^8.51.0",
|
||||
"mocha": "^10.2.0",
|
||||
"ts-mocha": "^10.0.0",
|
||||
@@ -40,6 +41,358 @@
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz",
|
||||
"integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz",
|
||||
"integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-x64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz",
|
||||
"integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-arm64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz",
|
||||
"integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-x64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz",
|
||||
"integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-arm64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz",
|
||||
"integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-x64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz",
|
||||
"integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz",
|
||||
"integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz",
|
||||
"integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ia32": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz",
|
||||
"integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-loong64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz",
|
||||
"integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-mips64el": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz",
|
||||
"integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==",
|
||||
"cpu": [
|
||||
"mips64el"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ppc64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz",
|
||||
"integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-riscv64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz",
|
||||
"integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-s390x": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz",
|
||||
"integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-x64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz",
|
||||
"integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-x64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz",
|
||||
"integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"netbsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-x64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz",
|
||||
"integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"openbsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/sunos-x64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz",
|
||||
"integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"sunos"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-arm64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz",
|
||||
"integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-ia32": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz",
|
||||
"integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-x64": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz",
|
||||
"integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint-community/eslint-utils": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
|
||||
@@ -855,6 +1208,43 @@
|
||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/esbuild": {
|
||||
"version": "0.19.5",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz",
|
||||
"integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"bin": {
|
||||
"esbuild": "bin/esbuild"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@esbuild/android-arm": "0.19.5",
|
||||
"@esbuild/android-arm64": "0.19.5",
|
||||
"@esbuild/android-x64": "0.19.5",
|
||||
"@esbuild/darwin-arm64": "0.19.5",
|
||||
"@esbuild/darwin-x64": "0.19.5",
|
||||
"@esbuild/freebsd-arm64": "0.19.5",
|
||||
"@esbuild/freebsd-x64": "0.19.5",
|
||||
"@esbuild/linux-arm": "0.19.5",
|
||||
"@esbuild/linux-arm64": "0.19.5",
|
||||
"@esbuild/linux-ia32": "0.19.5",
|
||||
"@esbuild/linux-loong64": "0.19.5",
|
||||
"@esbuild/linux-mips64el": "0.19.5",
|
||||
"@esbuild/linux-ppc64": "0.19.5",
|
||||
"@esbuild/linux-riscv64": "0.19.5",
|
||||
"@esbuild/linux-s390x": "0.19.5",
|
||||
"@esbuild/linux-x64": "0.19.5",
|
||||
"@esbuild/netbsd-x64": "0.19.5",
|
||||
"@esbuild/openbsd-x64": "0.19.5",
|
||||
"@esbuild/sunos-x64": "0.19.5",
|
||||
"@esbuild/win32-arm64": "0.19.5",
|
||||
"@esbuild/win32-ia32": "0.19.5",
|
||||
"@esbuild/win32-x64": "0.19.5"
|
||||
}
|
||||
},
|
||||
"node_modules/escalade": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
|
||||
|
||||
+9
-7
@@ -1,17 +1,18 @@
|
||||
{
|
||||
"name": "numeralize-ru",
|
||||
"version": "2.0.0-alpha.1",
|
||||
"version": "2.0.0-alpha.2",
|
||||
"description": "Russian numerals",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./lib/types/index.d.ts",
|
||||
"require": "./lib/cjs/index.js",
|
||||
"import": "./lib/esm/index.js",
|
||||
"default": "./lib/esm/index.js"
|
||||
"types": "./lib/index.d.ts",
|
||||
"require": "./lib/index.js",
|
||||
"import": "./lib/index.js",
|
||||
"default": "./lib/index.js",
|
||||
"browser": "./lib/index.browser.js"
|
||||
}
|
||||
},
|
||||
"main": "lib/cjs/index.js",
|
||||
"main": "lib/index.js",
|
||||
"files": [
|
||||
"lib/",
|
||||
"LICENSE.md",
|
||||
@@ -22,7 +23,7 @@
|
||||
"dev": "ts-mocha src/**.spec.ts -w --watch-files 'src/**.ts'",
|
||||
"test": "ts-mocha src/**.spec.ts",
|
||||
"lint": "eslint src/*",
|
||||
"build": "rm -rf ./lib && tsc --build ./tsconfig.amd.json ./tsconfig.cjs.json ./tsconfig.esm.json ./tsconfig.types.json ./tsconfig.umd.json",
|
||||
"build": "rm -rf ./lib && tsc --build && esbuild ./lib/index.js --outfile=lib/index.browser.js --format=iife --global-name=numeralize",
|
||||
"prepublish": "npm run lint && npm run test && npm run build"
|
||||
},
|
||||
"keywords": [
|
||||
@@ -42,6 +43,7 @@
|
||||
"@types/mocha": "^10.0.2",
|
||||
"@typescript-eslint/eslint-plugin": "^6.8.0",
|
||||
"@typescript-eslint/parser": "^6.8.0",
|
||||
"esbuild": "^0.19.5",
|
||||
"eslint": "^8.51.0",
|
||||
"mocha": "^10.2.0",
|
||||
"ts-mocha": "^10.0.0",
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
import {Case, Gender, numeralize} from "./index";
|
||||
import {numeralize, Gender, Case} from "./index";
|
||||
import * as assert from "assert";
|
||||
|
||||
describe(numeralize.name, () => {
|
||||
|
||||
+112
-19
@@ -112,24 +112,6 @@ const LARGES = [
|
||||
)
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Pluralize noun according to count, e.g. `pluralize(42, 'рубль', 'рубля', 'рублей')`
|
||||
*/
|
||||
export function pluralize(count: number, one: string, two: string, five: string): string {
|
||||
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;
|
||||
}
|
||||
|
||||
function small(number: number, gender: Gender, kase: Case, animate: boolean): string {
|
||||
// Zero
|
||||
if (0 === number) {
|
||||
@@ -172,7 +154,117 @@ function small(number: number, gender: Gender, kase: Case, animate: boolean): st
|
||||
}
|
||||
|
||||
/**
|
||||
* Numeralize number
|
||||
* Выбирает нужную форму существительного в зависимости от количества.
|
||||
*
|
||||
* @param {number} count Количество
|
||||
* @param {string} one Форма существительного для одного предмета, например, «рубль»;
|
||||
* @param {string} two Форма существительного для двух предметов, например, «рубля»;
|
||||
* @param {string} five Форма существительного для пяти предмета, например, «рублей»;
|
||||
*
|
||||
* @example
|
||||
* // 'рублей'
|
||||
* pluralize(0, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рубль'
|
||||
* pluralize(1, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рубля'
|
||||
* pluralize(2, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рублей'
|
||||
* pluralize(5, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рублей'
|
||||
* pluralize(11, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рубль'
|
||||
* pluralize(21, 'рубль', 'рубля', 'рублей');
|
||||
*
|
||||
* @example
|
||||
* // 'рубля'
|
||||
* pluralize(22, 'рубль', 'рубля', 'рублей');
|
||||
*/
|
||||
export function pluralize(count: number, one: string, two: string, five: string): string {
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает числительное, соответствующее числу
|
||||
*
|
||||
* @param {number} number Целое число, для которого надо записать числительное
|
||||
*
|
||||
* @param {Gender} [gender=Gender.Masculine] Пол:
|
||||
* - {@link Gender.Masculine} – мужской (по умолчанию);
|
||||
* - {@link Gender.Feminine} – женский;
|
||||
* - {@link Gender.Neuter} – средний.
|
||||
*
|
||||
* @param {Case} [kase=Case.Nominative] Падеж
|
||||
* (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
|
||||
* - {@link Case.Nominative} — именительный (по умолчанию);
|
||||
* - {@link Case.Genitive} — родительный;
|
||||
* - {@link Case.Dative} — дательный;
|
||||
* - {@link Case.Accusative} — винительный;
|
||||
* - {@link Case.Instrumental} — творительный;
|
||||
* - {@link Case.Prepositional} — предложный.
|
||||
*
|
||||
* @param {boolean} [animate=false] Являются ли перечисляемые предметы одушевлёнными
|
||||
* (влияет на форму винительного падежа некоторых числительных)
|
||||
*
|
||||
* @example
|
||||
* // мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
|
||||
* numeralize(5122981121);
|
||||
*
|
||||
* @example
|
||||
* // женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
|
||||
* numeralize(5122981121, Gender.Feminine);
|
||||
*
|
||||
* @example
|
||||
* // средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
|
||||
* numeralize(5122981121, Gender.Neuter);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Nominative);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Genitive);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Dative);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Accusative);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Accusative, true);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Instrumental);
|
||||
*
|
||||
* @example
|
||||
* // мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
|
||||
* numeralize(5122981121, Gender.Masculine, Case.Prepositional);
|
||||
*/
|
||||
export function numeralize(
|
||||
number: number,
|
||||
@@ -214,3 +306,4 @@ export function numeralize(
|
||||
// Return
|
||||
return result.join(' ');
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "umd",
|
||||
"outDir": "./lib/amd/"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"outDir": "./lib/cjs/"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "es2020",
|
||||
"outDir": "./lib/esm/"
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -46,13 +46,13 @@
|
||||
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||
|
||||
/* Emit */
|
||||
"declaration": false,
|
||||
"declaration": true,
|
||||
/* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
||||
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
|
||||
// "outDir": "./", /* Specify an output folder for all emitted files. */
|
||||
"outDir": "./lib", /* Specify an output folder for all emitted files. */
|
||||
// "removeComments": true, /* Disable emitting comments. */
|
||||
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./lib/types",
|
||||
"declaration": true,
|
||||
"emitDeclarationOnly": true
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "umd",
|
||||
"outDir": "./lib/umd/"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user