Просмотр полной версии : цифры прописью
ironicman
21.08.2009, 09:35
Дорогие ПРО :moder: )))
Кто-нибудь встречался с такой вещью...как ввод чиста цифрами, а вывод его прописью.
Может кто-нибудь подскажет пример, как это кодом делается...
Добавлено через 7 минут
1985 - тысяча девятьсот восемдесят пять
203- двести три
25 двадцать пять
я делал схожее несьедобным способом: выдираешь последнюю цифру, переводишь в слово (просто описать цифры 1-9, если 0 ничего), вносишь исключения 10-19, аналогично для второго числа с конца, третьего... исходника не сохранилось, после уничтожения прошлого веника...
ironicman
21.08.2009, 13:35
Да я могу посидеть попариться с иф...но этож УЖАС ))))
Я думал может кто какой пример кодом подкинет...
Напишите алгоритм разбра чисового значениея с условиями. Например, если цифры "19" появляются в числе 1990, то они читаются не "девятнадцать", а "тысяча девятьсот". и т. д.
Работа кропотливая, но не неподъемная.
ironicman
23.08.2009, 14:30
А пример такого алгаритма можно? Я не специалист же)
Psycho Tiger
23.08.2009, 16:15
На javascript`е. (http://madcms.ru/?com=page&id=4)
Вот. Тестим...
trace(c2sConvert(948019321506));
trace(c2sConvert(-102005000006));
trace(c2sConvert(1000000000000));
trace(c2sConvert(-1000000000000));
//* * * * * * * * * * * * * * * * *
function c2sConvert(num:Number):String {
var solidArray:Array = ["", " од", " дв", " три", " четыре", " пять", " шесть", " семь", " восемь", " девять", " десять", " одиннадцать", " двенадцать", " тринадцать", " четырнадцать", " пятнадцать", " шестнадцать", " семнадцать", " восемнадцать", " девятнадцать"];
var teensArray:Array = [" двадцать", " тридцать", " сорок", " пятьдесят", " шестьдесят", " семьдесят", " восемьдесят", " девяносто"];
var hundredArray:Array = ["", " сто", " двести", " триста", " четыреста", " пятьсот", " шестьсот", " семьсот", " восемьсот", " девятьсот"];
var numSuffixArrayOne:Array = ["ин", "на", "ин", "ин"]
var numSuffixArrayTwo:Array = ["а", "е", "а", "а"];
var resultString:String = "";
var resultArray:Array = ["","","",""];
var minus:String = "";
////
if (num < -999999999999) return "ОШИБКА : число меньше -999999999999";
if (num > 999999999999) return "ОШИБКА : число больше 999999999999";
if (num < 0) {
minus = "минус ";
num*=-1
}
if (num == 0) return "ноль";
var orderArray:Array = ["", " тысяч", " миллион", " миллиард"];
var numParts:Array = new Array();
var i:Number = num;
var d:Number = 0;
var order:Number = 0;
while(i>=1)
{
d = i;
i = Math.floor(i/1000);
numParts[order] = d-i*1000;
order++;
}
for(var g:Number=0; g<order; g++)
{
var hundredString:String = "";
var decimalString:String = "";
var solString:String = "";
var numSuffix:String = "";
var strSuffix:String = "";
var string:String = "";
var temp:Number = numParts[g];
var hundred:Number = Math.floor(temp/100);
if (hundred)
{
temp -= hundred*100;
hundredString = hundredArray[hundred];
}
var decimal:Number = Math.floor(temp/10);
if (decimal>1)
{
temp -= decimal*10;
decimalString = teensArray[decimal-2];
}
if (temp == 1) numSuffix = numSuffixArrayOne [g];
if (temp == 2) numSuffix = numSuffixArrayTwo [g];
if (g == 1 && temp == 1) strSuffix = "а"; // "1 тысячА"
if (g == 1 && temp > 1 && temp < 5) strSuffix = "и"; // "2-4 тысячИ"
if (g > 1 && temp > 1 && temp < 5) strSuffix = "а"; // "2-4 миллионА-миллиардА"
if (g > 1 && temp > 4) strSuffix = "ов"; // "5-9 миллионОВ - миллиардОВ"
if (g > 1 && temp == 0) strSuffix = "ов"; // "100-900 миллионОВ - миллиардОВ"
solString = solidArray[temp] + numSuffix + (numParts[g] == 0 ? "" : orderArray[g] + strSuffix);
string = hundredString + decimalString + solString;
resultArray[g] = string;
}
var preString:String = resultArray[3] + resultArray[2] + resultArray[1] + resultArray[0];
resultString = preString.substr(0,1) == " " ? preString.substring(1) : preString;
return (minus + resultString);
}
Работает!
Только если использовать где попало, проверка нужна на тип переменной у c2sConvert и ее целочисленность.
А вообще, мне казалсь, что код более громоздким должен быть для этого. :)
Как обычно, супер пример!
Было бы вообще зашибись, если бы была звуковая поддержка, озвучка цифр:D
Хотя по данному примеру и самому можно уже сообразить:quiet:
ironicman
24.08.2009, 09:26
Да уж... народ так как я хочу разобраться в коде. кто-нибудь может мне его описать? Чтоб я учебник почитал и так далее...на будущее
ironicman, я по алгоритму расскажу, а синтаксис Вы уж по учебникам/хелпу смотрите.
Как говорит наш гуру, сначала явление надо ДЕкодировать, а потом уже ЗАкодировать его в АС.
Вобщем любое число в русском языке произносится по маске:
[0-999 миллиардов]+[0-999 миллионов]+[0-999 тысяч]+[0-999]
Т.е. каждый блок звучит одинаково, за исключением "порядка". Сама собой напрашивается обработка в цикле. Поэтому сначала мы готовим число, разбивая его на 4 части по максимум 3 знака - делим его на 1000 в цикле while, пока результат не станет меньше единицы - и записываем части в массив numParts.
Далее начинаем цикл, в котором рассматриваем каждую часть, приводя ее к простому звучанию (типа "сто двадцать шесть"). Для этого : делим на 100 - узнаем индекс для слова в массиве "сотен", отнимаем из числа "все" сотни, остаток делим на 10 - узнаем индекс в массиве "десятков" (если десятков больше одного, т.е. от двадцати и выше) - отнимаем это количество десятков и у нас остаются только единицы 0-19 - индекс для массива "единиц".
Затем подставляем порядок в зависимости от того, какая часть исходного числа обрабатывается (итератор g, он же индекс массива numParts, он же служит для извлечения слова-порядка из массива orderArray). Ну и остается только подобрать суффикс (он зависит от порядка - "тысяча" женского рода - и от числа единиц 1, 2, 3-4, 5-9). Подставляем суффиксы, собираем строковое представление всей части, и записываем в массив resultArray. Пройдясь так по всем частям исходного числа, выходим из цикла и собираем результат, складывая строки, сохраненные в resultArray.
ironicman
24.08.2009, 20:26
Спасибо огроменное! То что надо!!!
А при чем тут флэш? Чисто алгоритмическая задача - хоть на фортране пиши :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.