Skip to content

Instantly share code, notes, and snippets.

@A
Last active December 17, 2015 14:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save A/5626045 to your computer and use it in GitHub Desktop.
Save A/5626045 to your computer and use it in GitHub Desktop.
Написал JavaScript функцию, которая правильно склоняет единицы измерения числительных, например «1 час», «11 минут», «21 грамм», «5 толстых шлюх».
/**
* Функция возвращает строку с числом и названием единиц измерения (например '1 час', '11 минут', '21 грамм', '5 толстых шлюх').
* @param {Number} number Число
* @param {String} nominative Название единиц измерения в иминительном падеже и ед.числе (час, минута)
* @param {String} genitive Название единиц измерения в родительном падеже и ед.числе (часа, минуты)
* @param {String} genitive_pl Название единиц измерения в родительном падеже и ед.числе (часов, минут)
* @param {Bool} showZero Показывать ли результат, если number = 0
* @return {String} '5 минут', '11 часов', '1 грамм'
*/
var getDeclinedNumeralStringForRussian = function (number, nominative, genitive, genitive_pl, showZero) {
if (!showZero && !number) { return ''; }
var cases = [nominative,genitive,genitive_pl];
if (number%100>4 && number%100<20) {
return number+' '+cases[2];
} else {
var refs = [2,0,1,1,1,2];
return number+' '+cases[refs[(number%10<5)?number%10:5]];
}
};
@mistakster
Copy link

А вот мой вариант:

function getDeclinedNumeralStringForRussian(value, nominative, genitive, genitive_pl) {
    value = parseInt(value);

    var str = "",
        valueMod100 = value % 100,
        valueMod10 = value % 10;

    if (valueMod100 < 10 || valueMod100 > 20) {
        if (valueMod10 === 1) {
            str = nominative;
        } else if (valueMod10 > 1 && valueMod10 < 5) {
            str = genitive;
        } else {
            str = genitive_pl;
        }
    } else {
        str = genitive_pl;
    }

    return "" + value + " " + str;
}

Вообще, лучше не заниматься склеиванием строк, а использовать библиотеки локализации и форматирования.

Я в своё время смотрел на https://github.com/SlexAxton/messageformat.js — очень мощная и гибкая система локализации. Но не стал таки её внедрять в проект из-за её большого объёма. У меня используется самописный вариант для форматирования русских строк. Других языков больше нет.

@A
Copy link
Author

A commented May 22, 2013

Да, у тебе здорово получилось, пожалуй на этом варианте и остановлюсь, спасибо!

Кстати, я последнее время вместо parseInt() пишу |0, очень удобно.
http://habrahabr.ru/post/172731/

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