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

Kreozot commented May 29, 2015

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

@jt3k
Copy link

jt3k commented Jun 19, 2015

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

@azatyar
Copy link

azatyar commented Nov 17, 2015

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

@retyui
Copy link

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
Copy link

malefique commented Nov 29, 2016

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

andreyzenkov commented Sep 29, 2017

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

@hazratgs
Copy link

hazratgs commented Oct 3, 2017

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

@kaskar2008
Copy link

kaskar2008 commented Nov 10, 2017

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

@kaskar2008
Copy link

kaskar2008 commented Nov 10, 2017

@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

denis-zinovev commented Jun 14, 2018

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

@tyurin-ilya
Copy link

tyurin-ilya commented Feb 13, 2019

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

@iwanttobealight
Copy link

iwanttobealight commented Feb 13, 2019

🔥

@sergiks
Copy link

sergiks commented Feb 24, 2019

@pauldasslier
Copy link

pauldasslier commented Sep 27, 2019

Чую автор взял код отсюда 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

drrainlab commented Nov 8, 2019

Спасибо!

@Sasha2018RL
Copy link

Sasha2018RL commented Nov 22, 2019

Спасибо!

@mandrikv
Copy link

mandrikv commented Feb 20, 2020

Спасибо!

@ilya-raevskiy
Copy link

ilya-raevskiy commented May 29, 2020

Спасибо!!!

@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

RuslanYestemessov commented Jul 22, 2021

Спасибо!

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