Преобразование дробного числа в строковый эквивалент (прописью)
Скрипт преобразования числа (дробногоцелого) в строковое представление (словами, прописью) с разбором дробного числа до 4 знаков после точки (до десятитысячных)
Возможности скрипта: 1.Преобразует дробное число в его число словами как положительное, так и отрицательное число. пример: число: 5.674 будет равно : пять целых шестьсот семьдесят четыре тысячных число: -0.8726 будет равно : минус ноль целых восемь тысяч семьсот двадцать шесть десятитысячных число: 8765214 будет равно : восемь миллионов семьсот шестьдесят пять тысяч двести четырнадцать
2.Преобразует число с учетом указанной валюты (RUR или USD), обрабатывает все окончания (как рубльрублярублейкопеекцентовдолларов и т.д). Выполняет преобразование дробного иили целого числа с учетом копеек или центов (в зависимости от указанной валюты) пример: сумма: 3.87 (в рублях) = три рубля восемьдесят семь копеек, (в долларах) = три доллара восемьдесят семь центов сумма: 875.5 (в рублях) = восемьсот семьдесят пять рублей пять копеек, (в долларах) = восемьсот семьдесят пять долларов пять центов сумма: 1 (в рублях) = один рубль, (в долларах) = один доллар сумма: 0.65 (в рублях) = шестьдесят пять копеек, (в долларах) = шестьдесят пять центов Разбор дробной части цены идет с учетом, что количество копеекцентов не может быть больше 100, иначе увеличивает общую сумму. пример: сумма: 2.201 (в рублях) = четыре рубля одна копейка, (в долларах) = четыре доллара один цент сумма: 0.101 (в рублях) = один рубль одна копейка, (в долларах) = один доллар один цент
/*
Данный модуль я перевел из модуля преобразования дробного числа в строкое представление
из языка Object Pascal (Delphi) в скриптовый язык php + добавленны данные с долларами.
Оригеналом модуля является модуль, написанный на Object Pascal (delphi).
Результат перевода в код php - работа кода на 100% соответствует оригеналу.
Функции, представляющая вещественные числа словами
function FloatToText($R,$Precision)
Преобразует вещественное (целое) число в текстовое представление с точностью
до Precision <= 4 знаков после точки.
function CurrencyToText($sum,$price = "RUR")
Преобразует сумму в слова (как целую, так и дробную)
если параметр $price = RUR - выводит со словами рублей иили копеек,
если $price = USD - со словами долларов иили центов
-------------------
function ArabicToRoman($num_int)
переводит целое число $num_int в римское представление числа
function RomanToArabic($rim_num)
переводит число из римского представления в арабское
-------------------
function AmountOfUnits($AUnit,$R,$Precision,$Options)
То же, что и FloatToText, но с учётом единицы измерения и опциями:
ntoExplicitZero: "ноль целых"
ntoMinus, ntoPlus: "минус", "плюс".
ntoNotReduceFrac: "пятьдесят сотых" вместо "пяти десятых".
function CountOfUnits($AUnit,$N,$Options)
То же для целых чисел. Все функции модуля реализованы через неё.
*/
private function GetNumberInWord($N,$Level) {
if ($Level == 1) {
switch ($N) {
case 0: return '';
case 1: if ($this->Gender() == GENMASCULINE) { return 'один'; }
else if ($this->Gender() == GENFEMININE) { return 'одна'; }
else if ($this->Gender() == GENNEUTER) { return 'одно'; }
case 2: if ($this->Gender() == GENMASCULINE) { return 'два'; }
else if ($this->Gender() == GENFEMININE) { return 'две'; }
else if ($this->Gender() == GENNEUTER) { return 'два'; }
case 3: return 'три';
case 4: return 'четыре';
case 5: return 'пять';
case 6: return 'шесть';
case 7: return 'семь';
case 8: return 'восемь';
case 9: return 'девять';
case 10: return 'десять';
case 11: return 'одиннадцать';
case 12: return 'двенадцать';
case 13: return 'тринадцать';
case 14: return 'четырнадцать';
case 15: return 'пятнадцать';
case 16: return 'шестнадцать';
case 17: return 'семнадцать';
case 18: return 'восемнадцать';
case 19: return 'девятнадцать';
}//switch
}//level 1
else if ($Level == 2) {
switch ($N) {
case 0: return '';
case 1: return 'десять';
case 2: return 'двадцать';
case 3: return 'тридцать';
case 4: return 'сорок';
case 5: return 'пятьдесят';
case 6: return 'шестьдесят';
case 7: return 'семьдесят';
case 8: return 'восемьдесят';
case 9: return 'девяносто';
}
}//level 2
else if ($Level == 3) {
switch ($N) {
case 0: return '';
case 1: return 'сто';
case 2: return 'двести';
case 3: return 'триста';
case 4: return 'четыреста';
case 5: return 'пятьсот';
case 6: return 'шестьсот';
case 7: return 'семьсот';
case 8: return 'восемьсот';
case 9: return 'девятьсот';
}
}//level 3
}
function Gender() {
return $this->UnitWord['Gender'];
}
function UnitWordInRightForm() {
$result = $this->UnitWord['Base'];
$slevel = $this->Levels(1);
if ($slevel == 1) { return $result.$this->UnitWord['End1']; }
if (($slevel == 0) or (($slevel >= 5) and ($slevel <= 19))) { return $result.$this->UnitWord['End5']; }
if (($slevel >= 2) or ($slevel <= 4)) { return $result.$this->UnitWord['End2']; }
}
private function Convert() {
if ($this->FNumber == 0) { return ''; }
$result = '';
for ($i = 3;$i >= 1;$i--) {
$s = $this->GetNumberInWord($this->Levels($i),$i);
if ($s != "") { $result .= $s.' '; }
}//for
return $result.$this->UnitWordInRightForm().' ';
}
// Количество цифр после запятой
if ($Precision < 0) { $Precision = 0; }
if ($Precision > $MaxPrecision) { $Precision = $MaxPrecision; }
$result = '';
if (($R > 0) and (@in_array('ntoPlus',$Options))) { $result = 'плюс '; }
if (($R < 0) and (@in_array('ntoMinus',$Options))) { $result = 'минус '; }
$R = abs($R);
// Если Precision = 0, т.е. без дробной части, округляется в большую сторону
if ($Precision > 0) { $n_int = Trunc($R); } else { $n_int = round($R); }
// Дробная часть
$n_frac = round(($R - $n_int) * $TenIn[$Precision]);
// Отбрасывание нулей в дробной части
// опция ntoNotReduceFrac не работает при n_frac = 0 (т.е. не будет "ноль сотых")
if (!@in_array('ntoNotReduceFrac',$Options)) {
while ((mod($n_frac, 10) == 0) and ($Precision > 0)) {
$n_frac = div($n_frac, 10);
$Precision--;
}
}//if
// Явная запись нуля
if ($n_int == 0) {
if ($n_frac == 0) {
// При отсутствии дробной части "ноль" добавляется вне зависимости от опции ntoExplicitZero
// "Result +" отброшено, чтобы избежать "минус ноль"
// при очень маленькой дробной части за пределами точности
return 'ноль '.$AUnit['Base'].$AUnit['End5']; }
else if (@in_array('ntoExplicitZero',$Options)) { $result .= 'ноль целых '; }
}//if
if ($n_frac == 0) { $result .= CountOfUnits($AUnit,$n_int, array()); } // N единиц
else { $result .= CountOfUnits($WD_INT,$n_int, array()); } // столько-то целых