Спасибо. Ранее я нашел и другие варианты этой функции.
|
Миллионы не правильно перекладывает....5000000.00 будет Пять миллионов тысяч рублей 00 копеек
|
Допилил:
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; Тоже самое для миллионов и миллиардов |
Вот этот вариант, вроде, рабочий: http://javascript.ru/forum/misc/4064...tml#post267889 но написано как-то криво, поэтому доковырял исходник топикстартера. В теме не нашёл полностью исправленного варианта (сумма 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); } |
сумма прописью
Avissian,
автор Sweet, источник http://javascript.ru/forum/misc/1741...tml#post105457 пример <!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> |
Часовой пояс GMT +3, время: 11:57. |