Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 11.05.2014, 22:27
BSI BSI вне форума
Аспирант
Отправить личное сообщение для BSI Посмотреть профиль Найти все сообщения от BSI
 
Регистрация: 01.06.2013
Сообщений: 48

Спасибо. Ранее я нашел и другие варианты этой функции.
Ответить с цитированием
  #12 (permalink)  
Старый 18.03.2015, 13:42
Новичок на форуме
Отправить личное сообщение для mintrhino Посмотреть профиль Найти все сообщения от mintrhino
 
Регистрация: 05.09.2014
Сообщений: 3

Миллионы не правильно перекладывает....5000000.00 будет Пять миллионов тысяч рублей 00 копеек
Ответить с цитированием
  #13 (permalink)  
Старый 18.03.2015, 16:37
Новичок на форуме
Отправить личное сообщение для mintrhino Посмотреть профиль Найти все сообщения от mintrhino
 
Регистрация: 05.09.2014
Сообщений: 3

Допилил:

case 1:
var last = _num.length - 1;
var _last_num = parseFloat(_num.charAt(last));
var _slice_num = _num.slice(0, -1);
var _pre_last_num = parseFloat(_slice_num);
if (_last_num == 1 && 1 != _pre_last_num) _string += 'тысяча ';
else if (_last_num == 1 && 1 == _pre_last_num.toString().length) _string += 'тысяча ';
else if (_last_num > 1 && _last_num < 5 && 1 != _pre_last_num) _string += 'тысячи ';
else if (parseFloat(_num) != 0) _string += 'тысяч ';
_string = _string.replace('один ', 'одна ');
_string = _string.replace('два ', 'две ');
break;

Тоже самое для миллионов и миллиардов
Ответить с цитированием
  #14 (permalink)  
Старый 19.08.2015, 10:08
Новичок на форуме
Отправить личное сообщение для Avissian Посмотреть профиль Найти все сообщения от Avissian
 
Регистрация: 19.08.2015
Сообщений: 1

Вот этот вариант, вроде, рабочий: Сумма прописью но написано как-то криво, поэтому доковырял исходник топикстартера. В теме не нашёл полностью исправленного варианта (сумма 1000000: "Один миллион тысяч рублей 00 копеек" проскакивает, например, везде. Так же двойные пробелы и некоторые другие недочеты).

Мой вариант с отладкой под Node.js (результат идентичен работе кода из ссылки в начале поста):
this.sum2str = function (_number) {
        var _arr_numbers = new Array();
        _arr_numbers[1] = new Array('', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
        _arr_numbers[2] = new Array('', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');
        _arr_numbers[3] = new Array('', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
        function intDiv(x, y){
          return (x-x%y)/y
        }
        function number_parser(_num, _desc, _number) {
                var _string = '';
                var _num_hundred = '';
                if (_num.length == 3) {
                        _num_hundred = _num.substr(0, 1);
                        _num = _num.substr(1, 3);
                        _string = _arr_numbers[3][_num_hundred] + ' ';
                }
                if (_num < 20) _string += (_number < 1 ? 'ноль' : _arr_numbers[1][parseFloat(_num)]) + ' ';
                else {
                        var _first_num = _num.substr(0, 1);
                        var _second_num = _num.substr(1, 2);
                        _string += _arr_numbers[2][_first_num] + ' ' + _arr_numbers[1][_second_num] + ' ';
                }
                switch (_desc){
                        case 0:
                                var _last_num = parseFloat(_num.substr(-1));
                                var _second_num = parseFloat(_num.substr(-2,1));
                                if (_last_num == 1 && (_second_num != 1 || String(_num).length == 1)) _string += 'рубль';
                                else if (_last_num > 1 && _last_num < 5 & (_second_num != 1 || String(_num).length == 1)) _string += 'рубля';
                                else _string += 'рублей';
                                break;
                        case 1:
                                if (intDiv(_number.slice(-6),1000) == 0) {break;}
                                var _last_num = parseFloat(_num.substr(-1));
                                var _second_num = parseFloat(_num.substr(-2,1));
                                if (_last_num == 1 && (_second_num != 1 || String(_num).length == 1)) _string += 'тысяча ';
                                else if (_last_num > 1 && _last_num < 5 & (_second_num != 1 || String(_num).length == 1)) _string += 'тысячи ';
                                else _string += 'тысяч ';
                                _string = _string.replace('один ', 'одна ');
                                _string = _string.replace('два ', 'две ');
                                break;
                        case 2:
                                if (intDiv(_number.slice(-9),1000000) == 0) {break;}
                                var _last_num = parseFloat(_num.substr(-1));
                                var _second_num = parseFloat(_num.substr(-2,1));
                                if (_last_num == 1 && (_second_num != 1 || String(_num).length == 1)) _string += 'миллион ';
                                else if (_last_num > 1 && _last_num < 5 && (_second_num != 1 || String(_num).length == 1)) _string += 'миллиона ';
                                else _string += 'миллионов ';
                                break;
                        case 3:
                                var _last_num = parseFloat(_num.substr(-1));
                                var _second_num = parseFloat(_num.substr(-2,1));
                                if (_last_num == 1 && (_second_num != 1 || String(_num).length == 1)) _string += 'миллиард ';
                                else if (_last_num > 1 && _last_num < 5 && (_second_num != 1 || String(_num).length == 1)) _string += 'миллиарда ';
                                else _string += 'миллиардов ';
                                break;
                }
                return _string;
        }
        function decimals_parser(_num) {
                var _first_num = _num.substr(0, 1);
                var _second_num = parseFloat(_num.substr(1, 2));
                var _string = ' ' + _first_num + _second_num;
                if (_second_num == 1 & _first_num != 1) _string += ' копейка';
                else if (_second_num > 1 && _second_num < 5) _string += ' копейки';
                else _string += ' копеек';
                return _string;
        }
        if (!_number || _number == 0) return 'Ноль рублей 00 копеек';
        if (typeof _number !== 'number') {
                _number = _number.replace(',', '.');
                _number = parseFloat(_number);
                if (isNaN(_number)) return 'Ноль рублей 00 копеек';
        }
        _number = _number.toFixed(2);
        if(_number.indexOf('.') != -1) {
                var _number_arr = _number.split('.');
                var _number = _number_arr[0];
                var _number_decimals = _number_arr[1];
        }
        var _number_length = _number.length;
        var _string = '';
        var _num_parser = '';
        var _count = 0;
        for (var _p = (_number_length - 1); _p >= 0; _p--) {
                var _num_digit = _number.substr(_p, 1);
                _num_parser = _num_digit +  _num_parser;
                if ((_num_parser.length == 3 || _p == 0) && !isNaN(parseFloat(_num_parser))) {
                        _string = number_parser(_num_parser, _count,_number) + _string;
                        _num_parser = '';
                        _count++;
                }
        }
        if (_number_decimals) _string += decimals_parser(_number_decimals);
        return _string.charAt(0).toUpperCase() + _string.substring(1).replace(/[ ]+/g,' ');
};

for (i=0;i<2000;i++) {
  var val = i*100000; //шаг инкремента для проверки
  console.log(this.sum2str(val)+" * "+val);
}
Ответить с цитированием
  #15 (permalink)  
Старый 19.08.2015, 11:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

сумма прописью
Avissian,
автор Sweet, источник сценарий, который сможет словами написать заданное число
пример

<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title> <meta charset="utf-8">
</head>

<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;
  };
}();

function fn(num)
{
   num = (''+num).split(/[.,]/);
   num[0] = +num[0] ? parseNumber(num[0],"рубл|ь|я|ей") : '';
   num[1] = +num[1] ? parseNumber(num[1],"копе|йка|йки|ек") : '';
   return   num.join( num[0] && num[1] ? " " : "")
}

document.write("10.00" + " => " + fn(10.00) + '<br>');
document.write(1000000 + " => " + fn(1000000) + '<br>');
document.write(0.03 + " => " + fn(0.03) + '<br>');
document.write(1001.00 + " => " + fn(1001.00) + '<br>');
document.write(1019.03 + " => " + fn(1019.03) + '<br>');
</script>
</body>


</html>
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сумма квадратов. henry1412 Internet Explorer 3 04.06.2013 21:14
Сумма вещественных чисел vaskon Общие вопросы Javascript 4 14.02.2013 11:02
сумма массива arahmanov Серверные языки и технологии 2 12.02.2013 17:55
Сумма вычитания в таблице mishanay Events/DOM/Window 5 14.01.2012 16:18
Сумма value динамически создаваемых input'ов (jQuery) Tazeg Элементы интерфейса 7 19.09.2011 23:22