сценарий, который сможет словами написать заданное число
подскажите ,пожалуйста,как разработать сценарий, который сможет словами написать заданное число. Например 5 535 -> Пять тысяч пятьсот тридцать пять.заранее большое спасибо!)
|
function parseNumber(a){if(a==="0")return"\u043d\u043e\u043b\u044c";if(isNaN(parseInt(a)))return"\u043d\u0435 \u0447\u0438\u0441\u043b\u043e";for(var e=[["","\u043e\u0434\u0438\u043d","\u0434\u0432\u0430","\u0442\u0440\u0438","\u0447\u0435\u0442\u044b\u0440\u0435","\u043f\u044f\u0442\u044c","\u0448\u0435\u0441\u0442\u044c","\u0441\u0435\u043c\u044c","\u0432\u043e\u0441\u0435\u043c\u044c","\u0434\u0435\u0432\u044f\u0442\u044c","\u0434\u0435\u0441\u044f\u0442\u044c","\u043e\u0434\u0438\u043d\u043d\u0430\u0434\u0446\u0430\u0442\u044c", "\u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u044c","\u0442\u0440\u0438\u043d\u0430\u0434\u0446\u0430\u0442\u044c","\u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044c","\u043f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c","\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c","\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c","\u0432\u043e\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c","\u0434\u0435\u0432\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c"], ["","\u0434\u0435\u0441\u044f\u0442\u044c","\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c","\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c","\u0441\u043e\u0440\u043e\u043a","\u043f\u044f\u0442\u044c\u0434\u0435\u0441\u044f\u0442","\u0448\u0435\u0441\u0442\u044c\u0434\u0435\u0441\u044f\u0442","\u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442","\u0432\u043e\u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442","\u0434\u0435\u0432\u044f\u043d\u043e\u0441\u0442\u043e"],["","\u0441\u0442\u043e", "\u0434\u0432\u0435\u0441\u0442\u0438","\u0442\u0440\u0438\u0441\u0442\u0430","\u0447\u0435\u0442\u044b\u0440\u0435\u0441\u0442\u043e","\u043f\u044f\u0442\u044c\u0441\u043e\u0442","\u0448\u0435\u0441\u0442\u044c\u0441\u043e\u0442","\u0441\u0435\u043c\u044c\u0441\u043e\u0442","\u0432\u043e\u0441\u0435\u043c\u044c\u0441\u043e\u0442","\u0434\u0435\u0432\u044f\u0442\u044c\u0441\u043e\u0442"],["\u0442\u044b\u0441\u044f\u0447","\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432","\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043e\u0432", "\u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432"]],c=a.length,b=[],d=0;c--;)b.unshift(e[d++][a.charAt(c)]),d===2&&Number(a.charAt(c))===1&&(b.shift(),b[0]=e[0][a.substring(c,c+2)]),d===3&&c!==0&&(b.unshift(e[3].shift()),d=0);a=b.length-5;switch(b[a]){case "\u043e\u0434\u0438\u043d":b[a]="\u043e\u0434\u043d\u0430";b[a+1]="\u0442\u044b\u0441\u044f\u0447\u0430";break;case "\u0434\u0432\u0430":b[a]="\u0434\u0432\u0435";b[a+1]="\u0442\u044b\u0441\u044f\u0447\u0438";break;case "\u0442\u0440\u0438":case "\u0447\u0435\u0442\u044b\u0440\u0435":b[a+ 1]="\u0442\u044b\u0441\u044f\u0447\u0438"}return b.join(" ").replace(/\s+$/,"")}alert(parseNumber(prompt("\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u043b\u043e"))); Могу предоставить и читаемый вариант с комментами. Но уже не просто за "большое спасибо";) |
Sweet,
1000000 == один миллионов тысяч |
рони, по-поводу склонения миллионов - это я исправил уже. А вот миллионов тысяч - такого бага я не нашел, спасибо:)
|
туда же :)
вместо _ должны быть пробелы "1000000__" - "сто___миллионов____тысяч" "1000000___" - "один миллиардов____миллионов____ты сяч" |
Цитата:
1. s/четыресто/четыреста/ 2. не указан верхний предел 3. ошибочный пример: Код:
123456789 |
Цитата:
Что касается верхнего предела, у алгоритма его нет, он ограчен длинной массива ["тысяч", "миллион"...]. А насчет общих усилий: вы мне достаточно помогли, указав на недочеты;) |
Sweet,
не обижайтесь, но Ваш код еще слишком сыроват. По поводу верхнего предела. Все-таки он есть, потому что массив жестко задан в теле самой функции и размером этого массива определяется верхний предел алгоритма. Задача действительно интересная и рад что помог. :-) |
Число прописью
Вариант прописью до секстиллиона ... :)
<script type="text/javascript"> function parseNumber(c) { function k(b, c) { var d = c[0], e = c[1], f = c[2]; return b % 10 == 1 && b % 100 != 11 ? d : b % 10 >= 2 && b % 10 <= 4 && (b % 100 < 10 || b % 100 >= 20) ? e : f } for (var d = { 0: { 1: "\u043e\u0434\u0438\u043d", 2: "\u0434\u0432\u0430", 3: "\u0442\u0440\u0438", 4: "\u0447\u0435\u0442\u044b\u0440\u0435", 5: "\u043f\u044f\u0442\u044c", 6: "\u0448\u0435\u0441\u0442\u044c", 7: "\u0441\u0435\u043c\u044c", 8: "\u0432\u043e\u0441\u0435\u043c\u044c", 9: "\u0434\u0435\u0432\u044f\u0442\u044c", 10: "\u0434\u0435\u0441\u044f\u0442\u044c", 11: "\u043e\u0434\u0438\u043d\u043d\u0430\u0434\u0446\u0430\u0442\u044c", 12: "\u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u044c", 13: "\u0442\u0440\u0438\u043d\u0430\u0434\u0446\u0430\u0442\u044c", 14: "\u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044c", 15: "\u043f\u044f\u0442\u043d\u0430\u0446\u0430\u0442\u044c", 16: "\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c", 17: "\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c", 18: "\u0432\u043e\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c", 19: "\u0434\u0435\u0432\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c", 20: "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c", 30: "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c", 40: "\u0441\u043e\u0440\u043e\u043a", 50: "\u043f\u044f\u0442\u044c\u0434\u0435\u0441\u044f\u0442", 60: "\u0448\u0435\u0441\u0442\u044c\u0434\u0435\u0441\u044f\u0442", 70: "\u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442", 80: "\u0432\u043e\u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442", 90: "\u0434\u0435\u0432\u044f\u043d\u043e\u0441\u0442\u043e", 100: "\u0441\u0442\u043e", 200: "\u0434\u0432\u0435\u0441\u0442\u0438", 300: "\u0442\u0440\u0438\u0441\u0442\u0430", 400: "\u0447\u0435\u0442\u044b\u0440\u0435\u0441\u0442\u0430", 500: "\u043f\u044f\u0442\u044c\u0441\u043e\u0442", 600: "\u0448\u0435\u0441\u0442\u044c\u0441\u043e\u0442", 700: "\u0441\u0435\u043c\u044c\u0441\u043e\u0442", 800: "\u0432\u043e\u0441\u0435\u043c\u044c\u0441\u043e\u0442", 900: "\u0434\u0435\u0432\u044f\u0442\u044c\u0441\u043e\u0442" }, 1: { 1: "\u043e\u0434\u043d\u0430", 2: "\u0434\u0432\u0435" } }, i = { 0: ["", "", ""], 1: ["\u0442\u044b\u0441\u044f\u0447\u0430", "\u0442\u044b\u0441\u044f\u0447\u0438", "\u0442\u044b\u0441\u044f\u0447"], 2: ["\u043c\u0438\u043b\u043b\u0438\u043e\u043d", "\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430", "\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432"], 3: ["\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434", "\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430", "\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043e\u0432"], 4: ["\u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d", "\u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430", "\u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432"], 5: ["\u043a\u0432\u0430\u0434\u0440\u0438\u043b\u043b\u0438\u043e\u043d", "\u043a\u0432\u0430\u0434\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u0430", "\u043a\u0432\u0430\u0434\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432"], 6: ["\u043a\u0432\u0438\u043d\u0442\u0438\u043b\u043b\u0438\u043e\u043d", "\u043a\u0432\u0438\u043d\u0442\u0438\u043b\u043b\u0438\u043e\u043d\u0430", "\u043a\u0432\u0438\u043d\u0442\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432"] }, h = "", j = (("" + c).match(/(\d{1,3})(?=((\d{3})*([^\d]|$)))/g)||[]).reverse(), e = 0; e < j.length; e++) { for (var f = d[e], c = j[e], b = "", g = 0; g < c.length; g++) if (a = c.substr(g), f && f[a] || d[0][a]) { b = b + " " + (f && f[a] || d[0][a]); break } else a = +c.substr(g, 1) * Math.pow(10, a.length - 1), +a in d[0] && (b = b + " " + d[0][a]); b && (b = c + " = " + b + " " + k(+c, i[e] || i[0]) + "<br />"); h = b + h } return h || "\u043d\u043e\u043b\u044c" }; document.write(parseNumber(" 12345678901234567890 ")) </script> |
<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> |
Часовой пояс GMT +3, время: 20:30. |