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, ['найдена', 'найдено', 'найдены']);
@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