Показать сообщение отдельно
  #10 (permalink)  
Старый 19.05.2011, 22:59
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

<body>
<script>
var parseNumber = function(){
  var dictionary = [
    [ "", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять",
    "десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать",
    "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать" ],
    [ "", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто" ],
    [ "", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот" ],
    [ "тысяч|а|и|", "миллион||а|ов", "миллиард||а|ов", "триллион||а|ов" ]
  ];
  function getNumber(number, limit){
    var temp = number.match(/^\d{1,3}([,|\s]\d{3})+/);
    if(temp) return temp[0].replace(/[,|\s]/g, "");
    temp = Math.abs( parseInt(number) );
    if( temp !== temp || temp > limit ) return null;
    return String(temp);
  };
  function setEnding(variants, number){
    variants = variants.split("|");
    number = number.charAt( number.length - 2 ) === "1" ? null : number.charAt( number.length - 1 );
    switch(number){
      case "1":
      return variants[0] + variants[1];
      case "2": case "3": case "4":
      return variants[0] + variants[2];
      default:
      return variants[0] + variants[3];
    };
  };
  function getPostfix(postfix, number){
    if( typeof postfix === "string" || postfix instanceof String ){
      if( postfix.split("|").length < 3 ) return " " + postfix;
      return " " + setEnding(postfix, number);
    };
    return "";
  };
  
  return function(number, postfix){
    if(typeof number === "undefined")
      return "999" + new Array(dictionary[3].length + 1).join(" 999");
    number = String( number );
    var minus = false;
    number.replace(/^\s+/, "").replace(/^-\s*/, function(){
      minus = true;
      return "";
    });
    number = getNumber(number, Number( new Array(dictionary[3].length + 2).join("999") ));
    if(!number) return "";
    postfix = getPostfix(postfix, number);
    if(number === "0") return "ноль" + postfix;
    var position = number.length, i = 0, j = 0, result = [];
    while(position--){
      result.unshift( dictionary[ i++ ][ number.charAt(position) ] );
      if(i === 2 && number.charAt(position) === "1" )
        result.splice(0, 2, dictionary[0][ number.substring( position, position + 2 ) ]);
      if(i === 3 && position !== 0 ){
        i = 0;
        if( position > 3 && number.substring( position - 3, position ) === "000" ){
          j++; continue;
        };
        result.unshift( setEnding(dictionary[3][j++], number.substring( 0, position )) );
      };
    };
    position = result.length - 5;
    switch( result[position] ){
      case "один": result[position] = "одна"; break;
      case "два": result[position] = "две"; break;
    };
    if(minus) result.unshift("минус");
    return result.join(" ").replace(/\s+$/, "").replace(/\s+/g, " ") + postfix;
  };
}();

document.write('Функция работает с положительными и отрицательными целыми числами:<br>');
document.write('parseNumber("1002000") : ' + parseNumber("1002000") + '<br>');
document.write('parseNumber("-4012") : ' + parseNumber("-4012") + '<br>');
document.write('Понимает разделители (пробел и запятая):<br>');
document.write('parseNumber("10,125,300") : ' + parseNumber("10,125,300") + '<br>');
document.write('Вторым параметром можно указать, например, размерность:<br>');
document.write('parseNumber("3 111", "(руб.)") : ' + parseNumber("3 111", "(руб.)") + '<br>');
document.write('Чтобы размерность склонялась, нужно указать окончания через |:<br>');
document.write('parseNumber("24", "пользовател|ь|я|ей") : ' + parseNumber("24", "пользовател|ь|я|ей") + '<br>');
document.write('parseNumber("151px", "пиксел|ь|я|ей") : ' + parseNumber("151px", "пиксел|ь|я|ей") + '<br>');
document.write('Чтобы узнать максимальное число, нужно вызвать ф-цию без аргументов:<br>');
document.write('parseNumber() : ' + parseNumber() + '<br>');
</script>
</body>

Последний раз редактировалось Sweet, 20.05.2011 в 01:13.
Ответить с цитированием