18.05.2011, 17:18
|
Интересующийся
|
|
Регистрация: 16.05.2011
Сообщений: 10
|
|
сценарий, который сможет словами написать заданное число
подскажите ,пожалуйста,как разработать сценарий, который сможет словами написать заданное число. Например 5 535 -> Пять тысяч пятьсот тридцать пять.заранее большое спасибо!)
|
|
18.05.2011, 19:05
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
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")));
Могу предоставить и читаемый вариант с комментами. Но уже не просто за "большое спасибо"
|
|
19.05.2011, 09:47
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Sweet,
1000000 == один миллионов тысяч
|
|
19.05.2011, 10:13
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
рони, по-поводу склонения миллионов - это я исправил уже. А вот миллионов тысяч - такого бага я не нашел, спасибо
|
|
19.05.2011, 12:47
|
|
Профессор
|
|
Регистрация: 17.06.2010
Сообщений: 152
|
|
туда же
вместо _ должны быть пробелы
"1000000__" - "сто___миллионов____тысяч"
"1000000___" - "один миллиардов____миллионов____ты сяч"
|
|
19.05.2011, 13:50
|
Профессор
|
|
Регистрация: 14.12.2009
Сообщений: 155
|
|
Сообщение от Sweet
|
Могу предоставить и читаемый вариант с комментами
|
Sweet, не занимайтесь позёрством, код далек от совершенства. Опубликуйте читабельный вариант, чтобы сообщество исправило его общими усилиями. Найденные ошибки:
1. s/четыресто/четыреста/
2. не указан верхний предел
3. ошибочный пример:
Код:
|
123456789
сто двадцать три миллионов четыресто пятьдесят шесть тысяч семьсот восемьдесят девять |
|
|
19.05.2011, 14:09
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от with-love-from-siberia
|
не занимайтесь позёрством
|
Во-первых, это не позерство. Меня заинтересовала задача, я ее решил, но потратил на это время, и считаю, что в праве требовать за это небольшое денежное вознаграждение. Я не считаю, что моя миссия помогать бесплатно хреновым студентам.
Что касается верхнего предела, у алгоритма его нет, он ограчен длинной массива ["тысяч", "миллион"...].
А насчет общих усилий: вы мне достаточно помогли, указав на недочеты
|
|
19.05.2011, 14:23
|
Профессор
|
|
Регистрация: 14.12.2009
Сообщений: 155
|
|
Sweet,
не обижайтесь, но Ваш код еще слишком сыроват.
По поводу верхнего предела. Все-таки он есть, потому что массив жестко задан в теле самой функции и размером этого массива определяется верхний предел алгоритма.
Задача действительно интересная и рад что помог. :-)
|
|
19.05.2011, 21:36
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Число прописью
Вариант прописью до секстиллиона ...
<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>
Последний раз редактировалось рони, 19.06.2014 в 22:49.
|
|
19.05.2011, 22:59
|
Профессор
|
|
Регистрация: 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.
|
|
|
|