Сумма прописью на JavaScript
Основной целью при написании являлось изобретение алгоритма, не основанного на математических действиях над заданным числом, а представлением его строковым значением с последующим посимвольным разбором.
алгоритм написан "с нуля" (все совпадения считать совпадениями :)
легко расширяется до триллионов и бо льших значений
нет привязки к рублям (может работать с долларами и другими денежными единицами)
исключено появление лишних пробелов
знак-разделитель для копеек - ''.'' или '',''
минимум математики ;)
<script language="JavaScript" type="text/javascript" >
/* ----------------------------
Сумма прописью на JavaScript
Автор: Mad Max
---------------------------- */
var money;
var price;
var rub, kop;
var litera = sotny = desatky = edinicy = minus = "" ;
var k = 0 , i, j;
N = ["" , "один" , "два" , "три" , "четыре" , "пять" , "шесть" , "семь" , "восемь" , "девять" ,
"" , "одиннадцать" , "двенадцать" , "тринадцать" , "четырнадцать" , "пятнадцать" , "шестнадцать" , "семнадцать" , "восемнадцать" , "девятнадцать" ,
"" , "десять" , "двадцать" , "тридцать" , "сорок" , "пятьдесят" , "шестьдесят" , "семьдесят" , "восемьдесят" , "девяносто" ,
"" , "сто" , "двести" , "триста" , "четыреста" , "пятьсот" , "шестьсот" , "семьсот" , "восемьсот" , "девятьсот" ,
"тысяч" , "тысяча" , "тысячи" , "тысячи" , "тысячи" , "тысяч" , "тысяч" , "тысяч" , "тысяч" , "тысяч" ,
"миллионов" ,"миллион" ,"миллиона" ,"миллиона" , "миллиона" , "миллионов" , "миллионов" , "миллионов" , "миллионов" , "миллионов" ,
"миллиардов" , "миллиард" , "миллиарда" , "миллиарда" , "миллиарда" , "миллиардов" , "миллиардов" , "миллиардов" , "миллиардов" , "миллиардов" ];
var M = new Array(10 );
for (j = 0 ; j < 10 ; ++j)
M[j] = new Array(N.length);
for (i = 0 ; i < N.length; i++)
for (j = 0 ; j < 10 ; j++)
M[j][i] = N[k++]
var R = new Array("рублей" , "рубль" , "рубля" , "рубля" , "рубля" , "рублей" , "рублей" , "рублей" , "рублей" , "рублей" );
var K = new Array("копеек" , "копейка" , "копейки" , "копейки" , "копейки" , "копеек" , "копеек" , "копеек" , "копеек" , "копеек" );
function num2str(money, target)
{
rub = "" , kop = "" ;
money = money.replace("," , "." );
if (isNaN(money)) {document.getElementById(target).innerHTML = "Не числовое значение" ; return }
if (money.substr(0 , 1 ) == "-" ) {money = money.substr(1 ); minus = "минус " }
else minus = "" ;
money = Math.round(money * 100 ) / 100 + "" ;
if (money.indexOf("." ) != -1 )
{
rub = money.substr(0 , money.indexOf("." ));
kop = money.substr(money.indexOf("." ) + 1 );
if (kop.length == 1 ) kop += "0" ;
}
else rub = money;
if (rub.length > 12 ) {document.getElementById(target).innerHTML = "Слишком большое число" ; return }
ru = propis(price = rub, R);
ko = propis(price = kop, K);
ko != "" ? res = ru + " " + ko: res = ru;
ru == "Ноль " + R[0 ] && ko != "" ? res = ko: 0 ;
kop == 0 ? res += " ноль " + K[0 ]: 0 ;
document.getElementById(target).innerHTML = (minus + res).substr(0 ,1 ).toUpperCase() + (minus + res).substr(1 );
}
function propis(price, D)
{
litera = "" ;
for (i = 0 ; i < price.length; i += 3 )
{
sotny = desatky = edinicy = "" ;
if (n(i + 2 , 2 ) > 10 && n(i + 2 , 2 ) < 20 )
{
edinicy = " " + M[n(i + 1 , 1 )][1 ] + " " + M[0 ][i / 3 + 3 ];
i == 0? edinicy += D[0 ]: 0 ;
}
else
{
edinicy = M[n(i + 1 , 1 )][0 ];
(edinicy == "один" && (i == 3 || D == K))? edinicy = "одна" : 0 ;
(edinicy == "два" && (i == 3 || D == K))? edinicy = "две" : 0 ;
i == 0 && edinicy != "" ? 0 : edinicy += " " + M[n(i + 1 , 1 )][i / 3 + 3 ];
edinicy == " " ? edinicy = "" : (edinicy == " " + M[n(i + 1 , 1 )][i / 3 + 3 ])? 0 : edinicy = " " + edinicy;
i == 0? edinicy += " " + D[n(i + 1 , 1 )]: 0 ;
(desatky = M[n(i + 2 , 1 )][2 ]) != "" ? desatky = " " + desatky: 0 ;
}
(sotny = M[n(i + 3 , 1 )][3 ]) != "" ? sotny = " " + sotny: 0 ;
if (price.substr(price.length - i - 3 , 3 ) == "000" && edinicy == " " + M[0 ][i / 3 + 3 ]) edinicy = "" ;
litera = sotny + desatky + edinicy + litera;
}
if (litera == " " + R[0 ]) return "ноль" + litera;
else return litera.substr(1 );
}
function n(start,len)
{
if (start > price.length) return 0 ;
else return Number(price.substr(price.length - start, len));
}
</script>
XHTML-код:
<input id="num" onKeyUp="num2str(this.value, 'str')" /> //Поле для ввода числа
<div id="str" /> //Поле для вывода числа прописью
IE, Mozilla Firefox and Opera compatible
YVeI5W , [url=http://einkvicxceul.com/]einkvicxceul[/url], [link=http://ocnvdhoaddse.com/]ocnvdhoaddse[/link], http://mvcdaaswuvxb.com/
pjAu21 <a href="http://qvxkrgxwxmjc.com/">qvxkrgxwxmjc</a>
DlPqnb , [url=http://ujdjdejvdopg.com/]ujdjdejvdopg[/url], [link=http://sygcgbvuerjg.com/]sygcgbvuerjg[/link], http://iqzcmgdmvtae.com/
mryhlr <a href="http://rzfllspjhbvj.com/">rzfllspjhbvj</a>
Hey, that post leaves me feeling fosloih. Kudos to you!
SqRxu8 , [url=http://eevhsmuitplf.com/]eevhsmuitplf[/url], [link=http://kfwrosmpfjzw.com/]kfwrosmpfjzw[/link], http://nmeitmijlpog.com/
EXpclm <a href="http://ukgaiblyrqhv.com/">ukgaiblyrqhv</a>
Wheover wrote this, you know how to make a good article.
It's like you're on a misison to save me time and money!
nSQ5TD , [url=http://fcaxmqrcvljr.com/]fcaxmqrcvljr[/url], [link=http://kjppiufaozvo.com/]kjppiufaozvo[/link], http://ikwchsvlascn.com/
Wonderful exlpantaion of facts available here.
UOedsO <a href="http://jpmtmpcvegds.com/">jpmtmpcvegds</a>
If you're looking to buy these atcriles make it way easier.
Kewl you suhlod come up with that. Excellent!