Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 02.12.2015, 10:57
Новичок на форуме
Отправить личное сообщение для Север3 Посмотреть профиль Найти все сообщения от Север3
 
Регистрация: 02.12.2015
Сообщений: 6

Небольшое уточнение по предедущей функции от Sweet
Благодарю за функцию. Сам бы так красиво не собрал.
//Отмечу, что данная функция кроме пробела понимает и вертикальную черту.
//Поправил: при применении минуса не принимались пробелы, запятые и вертикаьные черты.
//Ограничил количество пробелов после минуса в количестве не больше одного, иначе минус игнорируется.
//Убрал блок поправки написания одна и две тысячи, поскольку при окончании с 10 до 19 он не работал, ввёл правку прямо в ответ.

var itog_zakaza ='- 1 119'
var itog_hcego = "рубл|ь|я|ей"
function parseNumber(){
  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("|").for < 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 = number.replace(/^\s+/, "").replace(/^-\s{2,}/, "").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 )) ); 
      };
	 }; 
	 //Отсда убрал блок исправления написания одна и две тысячи, поскольку при окончании с 10 до 19 он не работал. Исправление ввёл в конечный результат
    if(minus) result.unshift("минус"); 
    return result.join(" ").replace(/\s+$/, "").replace(/\s+/g, " ").replace(/один тысяча/, "одна тысяча").replace(/два тысячи/, "две тысячи") + postfix; 
  }; 
}; 
var parseNumber = parseNumber()
document.getElementById("s").innerHTML = parseNumber(itog_zakaza, itog_hcego).charAt(0).toUpperCase() + parseNumber(itog_zakaza, itog_hcego).slice(1) + ".";
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск