Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.05.2011, 17:18
Интересующийся
Отправить личное сообщение для Елена1991 Посмотреть профиль Найти все сообщения от Елена1991
 
Регистрация: 16.05.2011
Сообщений: 10

сценарий, который сможет словами написать заданное число
подскажите ,пожалуйста,как разработать сценарий, который сможет словами написать заданное число. Например 5 535 -> Пять тысяч пятьсот тридцать пять.заранее большое спасибо!)
Ответить с цитированием
  #2 (permalink)  
Старый 18.05.2011, 19:05
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 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")));

Могу предоставить и читаемый вариант с комментами. Но уже не просто за "большое спасибо"
Ответить с цитированием
  #3 (permalink)  
Старый 19.05.2011, 09:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Sweet,
1000000 == один миллионов тысяч
Ответить с цитированием
  #4 (permalink)  
Старый 19.05.2011, 10:13
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

рони, по-поводу склонения миллионов - это я исправил уже. А вот миллионов тысяч - такого бага я не нашел, спасибо
Ответить с цитированием
  #5 (permalink)  
Старый 19.05.2011, 12:47
Аватар для NoResponse
Профессор
Отправить личное сообщение для NoResponse Посмотреть профиль Найти все сообщения от NoResponse
 
Регистрация: 17.06.2010
Сообщений: 152

туда же
вместо _ должны быть пробелы
"1000000__" - "сто___миллионов____тысяч"
"1000000___" - "один миллиардов____миллионов____ты сяч"
Ответить с цитированием
  #6 (permalink)  
Старый 19.05.2011, 13:50
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Сообщение от Sweet
Могу предоставить и читаемый вариант с комментами
Sweet, не занимайтесь позёрством, код далек от совершенства. Опубликуйте читабельный вариант, чтобы сообщество исправило его общими усилиями. Найденные ошибки:

1. s/четыресто/четыреста/
2. не указан верхний предел
3. ошибочный пример:
Код:
123456789
сто двадцать три миллионов четыресто пятьдесят шесть тысяч семьсот восемьдесят девять
Ответить с цитированием
  #7 (permalink)  
Старый 19.05.2011, 14:09
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от with-love-from-siberia
не занимайтесь позёрством
Во-первых, это не позерство. Меня заинтересовала задача, я ее решил, но потратил на это время, и считаю, что в праве требовать за это небольшое денежное вознаграждение. Я не считаю, что моя миссия помогать бесплатно хреновым студентам.
Что касается верхнего предела, у алгоритма его нет, он ограчен длинной массива ["тысяч", "миллион"...].
А насчет общих усилий: вы мне достаточно помогли, указав на недочеты
Ответить с цитированием
  #8 (permalink)  
Старый 19.05.2011, 14:23
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Sweet,
не обижайтесь, но Ваш код еще слишком сыроват.
По поводу верхнего предела. Все-таки он есть, потому что массив жестко задан в теле самой функции и размером этого массива определяется верхний предел алгоритма.
Задача действительно интересная и рад что помог. :-)
Ответить с цитированием
  #9 (permalink)  
Старый 19.05.2011, 21:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Число прописью
Вариант прописью до секстиллиона ...
<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.
Ответить с цитированием
  #10 (permalink)  
Старый 19.05.2011, 22:59
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 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.
Ответить с цитированием
Ответ



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

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