Skip to content

Instantly share code, notes, and snippets.

@realmyst
Created October 4, 2011 19:34
Show Gist options
  • Save realmyst/1262561 to your computer and use it in GitHub Desktop.
Save realmyst/1262561 to your computer and use it in GitHub Desktop.
Склонение числительных в javascript
function declOfNum(number, titles) {
cases = [2, 0, 1, 1, 1, 2];
return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
}
use:
declOfNum(count, ['найдена', 'найдено', 'найдены']);
@malefique
Copy link

retyui наркоман

@Yalme
Copy link

Yalme commented Feb 6, 2017

Согласен с malefique. Автору спасибо.

@qfox
Copy link

qfox commented Mar 20, 2017

function declOfNum(n, titles) {
  return titles[n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2];
}

See http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html?id=l10n/pluralforms

@iCRIP
Copy link

iCRIP commented Mar 24, 2017

Автору спасибо!

@belozer
Copy link

belozer commented May 23, 2017

@zxqfox'у спасибо тоже )

@andreyzenkov
Copy link

Thank you! You helped me to save time. :)

@hazratgs
Copy link

hazratgs commented Oct 3, 2017

А как быть с числами с плавающей точкой, например 3.3?

@kaskar2008
Copy link

@hazratgs, с плавающей окончание не меняется ("часть" яблока)
1.2 яблока
3.5 яблока
12.3 яблока

@kaskar2008
Copy link

@retyui, спасибо. но:
number = Math.abs(number);
нужно перенести в подфункцию в первом варианте

@ilkome
Copy link

ilkome commented Dec 20, 2017

@zxqfox забыли скобочку.

declOfNum(n, titles) {
  return titles[(n % 10 === 1 && n % 100 !== 11) ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2]
}

@shchegol
Copy link

shchegol commented Jun 7, 2018

Спасибо огромное!

@denis-zinovev
Copy link

@zxqfox Спасибо! ;)

@tyurin-ilya
Copy link

Очень кратко и полезно.
Спасибо!

@dmorenogogoleva
Copy link

🔥

@sergiks
Copy link

sergiks commented Feb 24, 2019

@pauldasslier
Copy link

Чую автор взял код отсюда http://internetbrains.blogspot.com/2010/01/javascript.html

@lloydbanks
Copy link

lloydbanks commented Nov 5, 2019

@pauldasslier чую не взял, а спиздил 😃

@realmyst
Copy link
Author

realmyst commented Nov 5, 2019

@pauldasslier @lloydbanks тихо спздл и ушел, называется нашел. Ни признать, ни опровергнуть - не могу, это было 8 лет назад лол. Я и не знал, что тут активность какая-то, гитхаб не смог в нотификации :)

@drrainlab
Copy link

Спасибо!

@Sasha2018RL
Copy link

Спасибо!

@mandrikv
Copy link

Спасибо!

@ilya-raevskiy
Copy link

Спасибо!!!

@voznin
Copy link

voznin commented Jun 14, 2020

Спасибо!!!

@TLTHades
Copy link

TLTHades commented Sep 6, 2020

Нашел статью по теме с еще одним вариантом реализации этой задачи https://sitedev.ru/correct-word-close-to-number/

Для определения правильной формы существительного рядом с числом (счетная форма) сам использую вариант автора, но адаптированный под дробные (не целые) числа:

CountForm = (number, titles) => {
  number = Math.abs(number);
  if (Number.isInteger(number)) {
    cases = [2, 0, 1, 1, 1, 2];  
    return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
  }
  return titles[1];
}

Использование:
CountForm(count, ['рубль', 'рубля', 'рублей']);

@RuslanYestemessov
Copy link

Спасибо!

@WebDevMaster2016
Copy link

Спасибо!!!

@vnva
Copy link

vnva commented May 9, 2023

export function countFormat(
  number: number,
  one: string,
  two: string,
  five: string
): string {
  let absNumber = Math.abs(number);

  absNumber %= 100;
  if (number >= 5 && number <= 20) return five;

  absNumber %= 10;
  if (absNumber === 1) return one;

  if (absNumber >= 2 && absNumber <= 4) return two;

  return five;
}

@vlas-ilya
Copy link

vlas-ilya commented Oct 31, 2023

function declOfNum(count, one, two, few) {
    return [few, one, two, two, two, few][count % 100 > 10 && count % 100 < 20 ? 0 : Math.min(count % 10, 5)]
}

@Viiprogrammer
Copy link

JSDoc + Using new ES features + can return number with declined string

/**
 * Declines depending on the number
 * @param {number} number
 * @param {string[]} titles Strings for decline
 * @param {boolean} [full=false] If true - returns number + string
 * @return {string}
 */
export function declOfNum (number, titles, full = false) {
  const cases = [2, 0, 1, 1, 1, 2]

  const result = titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]]
  return full ? `${number} ${result}` : result
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment