Pull to refresh

Сумма прописью на Javascript

/*
*****************************************************************************
* ВЫВОД ЧИСЛА (СУММЫ) ПРОПИСЬЮ *
* (С) Roman V Doronin, Март 1994 (перевод на JavaScript Январь 2007) *
*****************************************************************************
*/

//------------------------------------------------------------------------------
// Запись числа прописью
function numberInWords(sum){
// Параметры: sum — сумма (целое число)
// Возврат: число прописью или false-error
sum=Number(Math.round(sum));//-для подстраховки
if (sum>999999999){return false;}//-ожидалось число меньше 1.000.000.000
if (sum==0) return ' ноль';
//переведем число в 9-ти битную строку
var ax='000000000'+String(sum);ax=ax.substr(ax.length-9);
var retVal='';
//сформируем массивы
var listWords={
1:{1:' сто',2:' двести',3:' триста',4:' четыреста',5:' пятьсот',6:' шестьсот',7:' семьсот',8:' восемьсот',9:' девятьсот'},
2:{1:' десять',2:' двадцать',3:' тридцать',4:' сорок',5:' пятьдесят',6:' шестьдесят',7:' семьдесят',8:' восемьдесят',9:' девяносто'},
3:{1:' один',2:' два',3:' три',4:' четыре',5:' пять',6:' шесть',7:' семь',8:' восемь',9:' девять'},
4:{1:' одиннадцать',2:' двенадцать',3:' тринадцать',4:' четырнадцать',5:' пятнадцать',6:' шестнадцать',7:' семнадцать',8:' восемнадцать',9:' девятнадцать'},
5:{1:'',2:'а',3:'а',4:'а',5:'ов',6:'ов',7:'ов',8:'ов',9:'ов'},
6:{1:'а',2:'и',3:'и',4:'и',5:'',6:'',7:'',8:'',9:''}
};
var listEnding={1:' миллион',2:' тысяч',3:' '};
var arrBit=[0,4,2,1];
//формирование выходной строки
for (i=1;i<4;i++){
bx=ax.substr((i-1)*3,3);
if (Math.round(bx!=0)){
c=0;for (i1=1;i1<4;i1++){if (bx.substr(i1-1,1)!='0') c+=arrBit[i1];}
for (i1=1;i1<4;i1++){
if (bx.substr(i1-1,1)=='0') continue;
if (i==2 && i1==3 && bx.substr(3-1,1)=='1'){retVal+=' одна';continue;}
if (i==2 && i1==3 && bx.substr(3-1,1)=='2'){retVal+=' две';continue;}
if (bx.substr(2-1,1)=='1' && c/2!=Math.round(c/2) && i1==2){retVal+=listWords[4][Math.round(bx.substr(3-1,1))];i1=3;c-=1;continue;}
retVal+=listWords[i1][bx.substr(i1-1,1)];
}
}else if (i!=3) continue;
//-сформируем окончание
if (Math.round(c/2)==c/2){
if (i==1)retVal+=' миллионов';
if (i==2)retVal+=' тысяч';
if (i==3) continue;
}else {
if (i==3) continue;//-пропустим рубли
retVal+=listEnding[i]+listWords[4+i][Math.round(bx.substr(3-1,1))];}
}
return retVal;
}

//------------------------------------------------------------------------------
// Перевод числа в сумму прописью
// Вызов: receiveInWordsSum(<число>[,<тип валюты>][,<флаг вывода дробного числа>][,<флаг вывод с заглавной буквы>])
function receiveInWordsSum(sum){
// Параметры: sum — сумма (число или строковый тип-если дробная часть может оканчиваться на 0)
// сurrency — валюта:
// 0 — рубли (по умолчанию)
// 1 — доллары
// 10 — тонны
// 11 — километры
// 12 — литры
// 13 — штуки
// flagCopeck — флаг вывода с копейками:
// false или 0 — без копеек (по умолчанию)
// 1 — копейки числом
// 2 — копейки прописью (не реализовано)
// flagUpper — true — первый символ переводится в заглавный
// false — подавить перевод первого символа в заглавный (по умолчанию)
// Возврат: сумма прописью в формате сurrency и в зависимости от флага сurrency
var сurrency=arguments[1] || 0;
var flagCopeck=arguments[2] || 0;
var flagUpper=arguments[3] || false;
//массив валют
var listCurrency={
0:{1:'рубл',2:'копе'},
1:{1:'доллар',2:'цент'},
10:{1:'тонн',2:'килограмм'},
11:{1:'километр',2:'метр'},
12:{1:'литр',2:''},
13:{1:'штук',2:''}
};
//-массив окончаний валют
var listEndingCurrency={
0:{0:'ей',1:'ь',2:'я',3:'я',4:'я',5:'ей',6:'ей',7:'ей',8:'ей',9:'ей'},//-рубли
1:{0:'ов',1:'',2:'а',3:'а',4:'а',5:'ов',6:'ов',7:'ов',8:'ов',9:'ов'},//-доллары
10:{0:'',1:'а',2:'ы',3:'ы',4:'ы',5:'',6:'',7:'',8:'',9:''},//-тонны
11:{0:'ов',1:'',2:'а',3:'а',4:'а',5:'ов',6:'ов',7:'ов',8:'ов',9:'ов'},//-километры
12:{0:'ов',1:'',2:'а',3:'а',4:'а',5:'ов',6:'ов',7:'ов',8:'ов',9:'ов'},//-литры
13:{0:'',1:'а',2:'и',3:'и',4:'и',5:'',6:'',7:'',8:'',9:''} //штуки
//1:{0:'',1:'',2:'',3:'',4:'',5:'',6:'',7:'',8:'',9:''},//зарезервировано
};
//-массив окончаний дробных частей валют
var listEndingDenominatorCurrency={
0:{0:'ек',1:'йка',2:'йки',3:'йки',4:'йки',5:'ек',6:'ек',7:'ек',8:'ек',9:'ек'},//-копейки
1:{0:'ов',1:'',2:'а',3:'а',4:'а',5:'ов',6:'ов',7:'ов',8:'ов',9:'ов'},//-центы
10:{0:'',1:'',2:'а',3:'а',4:'а',5:'',6:'',7:'',8:'',9:''},//-килограммы
11:{0:'ов',1:'',2:'а',3:'а',4:'а',5:'ов',6:'ов',7:'ов',8:'ов',9:'ов'}//-метры
12:{0:'ов',1:'',2:'а',3:'а',4:'а',5:'ов',6:'ов',7:'ов',8:'ов',9:'ов'},//-литры
13:{0:'',1:'а',2:'и',3:'и',4:'и',5:'',6:'',7:'',8:'',9:''} //штуки
//1:{0:'',1:'',2:'',3:'',4:'',5:'',6:'',7:'',8:'',9:''},//зарезервировано
};

//формируем выходную строку
if (isNaN(sum)) return '';
sum=String(sum).match(/(\d+)\W*(\d*)/);
if(!sum) return '';
var numerator=sum[1] || 0;
var denominator=sum[2] || '00';
//сформируем целую часть
var retVal=numberInWords(numerator)+' '+listCurrency[сurrency][1]+listEndingCurrency[сurrency][Number(String(numerator.substr(numerator.length-1,1)))];
//формируем дробную часть
if (flagCopeck==1 && listCurrency[сurrency][2]) retVal+=' '+denominator+' '+listCurrency[сurrency][2]+listEndingDenominatorCurrency[сurrency][Number(String(denominator.substr(denominator.length-1,1)))];
//Переведем первую букву в заглавную
if (flagUpper){
retVal=firstSymbolToUpper(retVal);
}
return retVal;
}

//------------------------------------------------------------------------------
// Начинает предложение с большой буквы
function firstSymbolToUpper(val){
//Параметры: val — обрабатываемая строка
//Возвращает: полученную строку val в которой первый символ переведен в заглавный
return val.substr(1,1).toUpperCase()+val.substr(2);
}
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.