• Авторизация


Изобретаем велосипед или пишем числа прописью на jscript 21-10-2008 17:30 к комментариям - к полной версии - понравилось!


Недавно понадобилось решение тривиальной задачи  - числа прописью, на jscript (для отчетов - типа н рублей н копеек)

Подумал что довольно просто, решил не искать в инете а сделать сам,
посидел вечером часика два, но голова была не сильно вумная, поэтому на след день исправил глюки:

Итак, вводное число - целое
(Для обработки дробей позднее напишем функцию которая будет искать запятую а потом делить на части.)
Именовать числа просто, до тысяч, действительно что там 2 000 000 = 2 миллиона, 22 * 10 ^6 = 22 миллиона
и т.д.
единственно что нужно учесть 11-19 миллионов, они читаются одинаково вне зависимости от последней цифры.

С тысячами чуть сложнее, их надо именовать вместе с последней цифро 2 000 - не два тысячи а две тысячи,
поэтому их обрабатываем отдельно.

Схема такая, берем число, очищаем от посторонних знаков,
делим его длину на три, если остаток больше нуля то дописываем нули слева.
И дальше перебираем все тройки, для прописывания самой тройки используем отдельную функцию
число прописью (nnn), для окончания- nnn миллиардов
используем массив, с большими числами - указываете порядок тройки, получаете ответ.

В целом выглядит так:


function NumberInWords(number)
    {
        //в этом массиве идут числа склоненные в зависимости от цифры перед ними,
        //т.к. тысячи произносятся по особому то для них предыдущая цифра пишется явно
        var NumbArray =
        [
        ["тысяч", "одна тысяча","две тысячи","три тысячи","четыре тысячи","пять тысяч","шесть тысяч","семь тысяч","восемь тысяч","девять тысяч"],
        ["миллионов","миллион","миллиона","миллиона","миллиона","миллионов","миллионов","миллионов","миллионов","миллионов"],
        ["миллиардов","миллиард","миллиарда","миллиарда","миллиарда","миллиардов","миллиардов","миллиардов","миллиардов","миллиардов"],
        ["триллионов","триллион","триллиона","триллиона","триллиона","триллионов","триллионов","триллионов","триллионов","триллионов"],
        ["квадриллионов","квадриллион","квадриллиона","квадриллиона","квадриллиона","квадриллионов","квадриллионов","квадриллионов","квадриллионов","квадриллионов"],
        ];
       
        //очищаем от лишних знаков - оставляем цифры
        var input = ClearStringFromNonDigits(number);
       
       
       
        //считаем количество троек, если целый остаток от деления на три больше нуля запоминаем его и дополняем слева нолями строку
        var count = Math.floor(input.length/3);
        var ost = input.length - count * 3;
        //var input = new String(number);
       
        var str = new String();
        if(ost > 0)
        {
            count +=1;
            for(var i=0; i<3-ost; i++)
            {
                input = "0" + input;
            }
        }
      
       //основной цикл
       //начиная с самой большой тройки идем вниз, с миллиардов на миллион, до тысяч, тысячи обрабатываются отдельно
       //тройка обрабатывается так, сначала пишем прописью число тройки - например 253, затем по последней цифре ищем склонение числа этой тройки,
       //например 253 миллиарда
       //!!с тысячами сложнее, там нужно брать первые две цифры - если средняя не единица, а затем по последней искать произношение
       //например 132 тысячи будет - 130 (сто тридцать)+2 две тысячи
       //но, 113 тысяч - 100 (сто )+ 13 (тринадцать) + тысяч (задаем нулевой индекс для тысяч)
       //то же и тройками больше тысячи, там случаи когда последние две цифры больше 10 и меньше 20 рассматриваются отдельно а то получится 111 = сто одинадцать миллион(смотрим ведь по последней цифре)
      
       
        for(var i=0; i<count-1; i++)
        {
            //разбор тысяч
            if(count - i <= 2)
            {
                if(input.substr(i*3+1,1)!= "1")
                {
                    var tmpstr = HundredToString(input.substr(i*3,2)+"0")
                    if(input.substr(i*3,3)!= "000")
                    str += tmpstr+" "+NumbArray[0][parseInt(input.substr(i*3+2,1))];
                  
                }
                else
                {
                    str += HundredToString(input.substr(i*3,1)+"00")+ HundredToString("0"+input.substr(i*3+1,2))+ " "+NumbArray[0][0];
                   
                }
            }//разбор чисел больше тысяч
            else
            {
                //пустые тройки не читаем
                if(input.substr(i*3,3)!= "000")
                {
                    if(input.substr(i*3+1,1)!= "1")
                    {
                        var tmpstr = HundredToString(input.substr(i*3,3));
                        str += tmpstr + " "+NumbArray[count-i-2][parseInt(input.substr(i*3+2,1))];
                    }
                    else
                    {
                       // debugger;
                        str += HundredToString(input.substr(i*3,1)+"00")+ HundredToString("0"+input.substr(i*3+1,2))+ " "+NumbArray[count-i-2][0];
                    }
                }
            }
           
           
        }
       
        str += HundredToString(input.substr(count*3-3,3));
           
         return str;
    }


    //сотни - трехзначные числа пишем прописью  
    function HundredToString(hundred)
    {
        var NumbArray =
        [
        ["одинадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семьнадцать","восемьнадцать","девятьнадцать"],
        ["один","два","три","четыре","пять","шесть","семь","восемь","девять","десять"],
        ["десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"],
        ["сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"]];
       
        //нам нужен объект строкового типа, приводим к нему число - hundred
        var hundredstr = new String(hundred);
       
        //нам нужно чтобы было 3 символа поэтому добавляем нули, если не хватает. нули не прочитываются в дальнейшем
        while(hundredstr.length < 3)
        {
            hundredstr = '0'+hundredstr;
        }
       
        //будущий результат
        var str = " ";
        for(var i=0;i<3;i++)
        {
            //нули не произносим
            if(hundredstr.charAt(i) != "0")
            {
                //если идут десятки то проверяем число меньше двадцати или нет, если меньше то добавляем n-дцать и выходим, иначе шагаем дальше
                if(i == 1 && hundredstr.charAt(i) == "1")
                {
                    //по вертикали индекс произносимого порядка (единицы, до 20, десятки, сотни) по горизонтали цифра которую выводим - адын два и т.д.
                    str += " "+NumbArray[0][ parseInt(hundredstr.charAt(i+1))-1 ];
                    return str;
                }
                str += " "+NumbArray[3-i][ parseInt(hundredstr.charAt(i)) - 1 ];
            }
        }
        return str;
    }

В приложении - веб страничка, где можно в окошко ввести число и получить ответ.
Дальнейшее развитие - рубли
Аналогично, смотрим последние две цифры и именуем в зависимости от них.
Об этом чуть позже

Если же вы хотите именовать по настоящему большие числа - например гос долг Америки, то вот вам список больших чисел:

тысяча
миллион
биллион
триллион
квадриллион
квинтиллион
секстиллион
септиллион

октиллион
нониллион
дециллион

ундециллион
додециллион
тредециллион
кваттуордециллион
квиндециллион
седециллион
септдециллион
дуодевигинтиллион
ундевигинтиллион
вигинтиллион
анвигинтиллион
дуовигинтиллион
тревигинтиллион
кватторвигинтиллион
квинвигинтиллион
сексвигинтиллион
септемвигинтиллион
октовигинтиллион
новемвигинтиллион
тригинтиллион
антригинтиллион
гугол
квадрагинтиллион
квинквагинтиллион
сексагинтиллион
септуагинтиллион
октогинтиллион
нонагинтиллион
центиллион
дуцентиллион

трецентиллион
квадрингентиллион
квингентиллион
сесцентиллион
септингентиллион
окстингентиллион
нонгентиллион
миллиллион (или милиаиллион)
дуомилиаллион
тремиллиаллион
дуцентдуомилианонгентновемдециллион
милиамилиаиллион
дуомилиамилиаиллион
гуголплекс
зиллион

вверх^ к полной версии понравилось! в evernote


Вы сейчас не можете прокомментировать это сообщение.

Дневник Изобретаем велосипед или пишем числа прописью на jscript | Чарубаэль - Дневник | Лента друзей Чарубаэль / Полная версия Добавить в друзья Страницы: раньше»