1+ /**
2+ * Decl of number
3+ *
4+ * @param value - value to decl
5+ * @param titles - titles to decl: ['новое событие', 'новых события', 'новых событий']
6+ * @example declOfNum(1, ['новое событие', 'новых события', 'новых событий']) -> 'новое событие'
7+ * @example declOfNum(2, ['новое событие', 'новых события', 'новых событий']) -> 'новых события'
8+ * @example declOfNum(10, ['новое событие', 'новых события', 'новых событий']) -> 'новых событий'
9+ * @example declOfNum(21, ['новое событие', 'новых события', 'новых событий']) -> 'новое событие'
10+ * @returns decl of number
11+ */
12+ export function declOfNum ( value : number , titles : string [ ] ) : string {
13+ const decimalBase = 10 ;
14+ const hundredBase = 100 ;
15+ const minExclusiveTeens = 4 ;
16+ const maxExclusiveTeens = 20 ;
17+ const manyFormIndex = 2 ;
18+ const maxCaseIndex = 5 ;
19+ const declCases = [ manyFormIndex , 0 , 1 , 1 , 1 , manyFormIndex ] ;
20+
21+ const valueModHundred = value % hundredBase ;
22+ const valueModTen = value % decimalBase ;
23+ const isTeens = valueModHundred > minExclusiveTeens && valueModHundred < maxExclusiveTeens ;
24+ const caseIndex = isTeens
25+ ? manyFormIndex
26+ : declCases [ valueModTen < maxCaseIndex ? valueModTen : maxCaseIndex ] ;
27+
28+ return titles [ caseIndex ] ;
29+ }
0 commit comments