Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Склонение числительных в 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, ['найдена', 'найдено', 'найдены']);
@Deliaz

This comment has been minimized.

Copy link

@Deliaz Deliaz commented Feb 16, 2015

Спасибо!
Самое короткое исполнение из всех что видел

@Kreozot

This comment has been minimized.

Copy link

@Kreozot Kreozot commented May 29, 2015

Только замените слово "числительные" в описании. Они тут не при чём.

@jt3k

This comment has been minimized.

Copy link

@jt3k jt3k commented Jun 19, 2015

и var cases сделай а то что оно у тебя глобальное?

@azatyar

This comment has been minimized.

Copy link

@azatyar azatyar commented Nov 17, 2015

не работает с отрицательными числами, необходимо добавить:
number = Math.abs(number);

@retyui

This comment has been minimized.

Copy link

@retyui retyui commented Sep 19, 2016

// @flow
const createCountFormatter = ({
  few,
  one,
  two
}: {|
  few: string,
  one: string,
  two: string
|}) => {
  const titles = [one, two, few];

  return (number: number): string => {
    const cases = [2, 0, 1, 1, 1, 2];

    return titles[
      number % 100 > 4 && number % 100 < 20
        ? 2
        : cases[number % 10 < 5 ? number % 10 : 5]
    ];
  };
};

export const formatAudioCount = createCountFormatter({
  few: "Аудиозаписей",
  one: "Аудиозапись",
  two: "Аудиозаписи"
});

//////////////////////////
test("should work correctly", () => {
  expect(formatAudioCount(0)).toBe("Аудиозаписей");
  expect(formatAudioCount(5)).toBe("Аудиозаписей");
  expect(formatAudioCount(6)).toBe("Аудиозаписей");
  expect(formatAudioCount(14)).toBe("Аудиозаписей");
  expect(formatAudioCount(1)).toBe("Аудиозапись");
  expect(formatAudioCount(2)).toBe("Аудиозаписи");
});
@malefique

This comment has been minimized.

Copy link

@malefique malefique commented Nov 29, 2016

retyui наркоман

@Yalme

This comment has been minimized.

Copy link

@Yalme Yalme commented Feb 6, 2017

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

@qfox

This comment has been minimized.

Copy link

@qfox 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

This comment has been minimized.

Copy link

@iCRIP iCRIP commented Mar 24, 2017

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

@belozer

This comment has been minimized.

Copy link

@belozer belozer commented May 23, 2017

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

@andreyzenkov

This comment has been minimized.

Copy link

@andreyzenkov andreyzenkov commented Sep 29, 2017

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

@hazratgs

This comment has been minimized.

Copy link

@hazratgs hazratgs commented Oct 3, 2017

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

@kaskar2008

This comment has been minimized.

Copy link

@kaskar2008 kaskar2008 commented Nov 10, 2017

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

@kaskar2008

This comment has been minimized.

Copy link

@kaskar2008 kaskar2008 commented Nov 10, 2017

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

@ilkome

This comment has been minimized.

Copy link

@ilkome 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

This comment has been minimized.

Copy link

@shchegol shchegol commented Jun 7, 2018

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

@denis-zinovev

This comment has been minimized.

Copy link

@denis-zinovev denis-zinovev commented Jun 14, 2018

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

@tyurin-ilya

This comment has been minimized.

Copy link

@tyurin-ilya tyurin-ilya commented Feb 13, 2019

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

@iwanttobealight

This comment has been minimized.

Copy link

@iwanttobealight iwanttobealight commented Feb 13, 2019

🔥

@sergiks

This comment has been minimized.

Copy link

@sergiks sergiks commented Feb 24, 2019

@pauldasslier

This comment has been minimized.

Copy link

@pauldasslier pauldasslier commented Sep 27, 2019

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

@lloydbanks

This comment has been minimized.

Copy link

@lloydbanks lloydbanks commented Nov 5, 2019

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

@realmyst

This comment has been minimized.

Copy link
Owner Author

@realmyst realmyst commented Nov 5, 2019

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

@drrainlab

This comment has been minimized.

Copy link

@drrainlab drrainlab commented Nov 8, 2019

Спасибо!

@Sasha2018RL

This comment has been minimized.

Copy link

@Sasha2018RL Sasha2018RL commented Nov 22, 2019

Спасибо!

@mandrikv

This comment has been minimized.

Copy link

@mandrikv mandrikv commented Feb 20, 2020

Спасибо!

@ilya-raevskiy

This comment has been minimized.

Copy link

@ilya-raevskiy ilya-raevskiy commented May 29, 2020

Спасибо!!!

@voznin

This comment has been minimized.

Copy link

@voznin voznin commented Jun 14, 2020

Спасибо!!!

@TLTHades

This comment has been minimized.

Copy link

@TLTHades 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, ['рубль', 'рубля', 'рублей']);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.