Мир ВебМастера
Меню сайта
Категории каталога
Текстовые эффекты [10]
Визуальные эффекты [10]
Игры на javascript [10]
Курсоры [10]
Часы и Календари [9]
Меню навигации [1]
Случайный вывод [4]
Скроллинг [3]
Скрипты AJAX [16]
Скрипты Java [32]
Sundry [40]
Главная » Файлы » СКРИПТЫ » Sundry

Преобразование числа в текст
Бесплатная раскрутка сайта
[ ] 17.03.2009, 01:04

Данный скрипт реализует преобразование чисел в текст

, т.е., на примере денежной суммы,
из 1256.18 получим Одна тысяча двести пятьдесят шесть рублей 18 копеек.
В этом классе всё настолько прозрачно, что он почти не загружен лишними комментариями.
Скрипт в нижней своей части содержит форму для тестовой работы, которую необходимо убрать в рабочей версии.

class NumToText
{
  var $Mant = array(); // описания мантисс
  // к примеру (’рубль’, ‘рубля’, ‘рублей’)
  // или (’метр’, ‘метра’, ‘метров’)
  var $Expon = array(); // описания экспонент
  // к примеру (’копейка’, ‘копейки’, ‘копеек’)
  function NumToText()
  {
  }
  // установка описания мантисс
  function SetMant($mant)
  {
     $this->Mant = $mant;
  }
  // установка описания экспонент
  function SetExpon($expon)
  {
     $this->Expon = $expon;
  }
  // функция возвращает необходимый индекс описаний разряда
  // (’миллион’, ‘миллиона’, ‘миллионов’) для числа $ins
  // например для 29 вернется 2 (миллионов)
  // $ins максимум два числа
  function DescrIdx($ins)
  {
     if(intval($ins/10) == 1) // числа 10 - 19: 10 миллионов, 17 миллионов
     return 2;
     else
     {
        // для остальных десятков возьмем единицу
        $tmp = $ins%10;
        if($tmp == 1) // 1: 21 миллион, 1 миллион
        return 0;
        else if($tmp >= 2 && $tmp <= 4)
        return 1; // 2-4: 62 миллиона
        else
        return 2; // 5-9 48 миллионов
     }
  }
  // IN: $in - число,
  // $raz - разряд числа - 1, 1000, 1000000 и т.д.
  // внутри функции число $in меняется
  // $ar_descr - массив описаний разряда (’миллион’, ‘миллиона’, ‘миллионов’) и т.д.
  // $fem - признак женского рода разряда числа (true для тысячи)
  function DescrSot(&$in, $raz, $ar_descr, $fem = false)
  {
     $ret = ”;
     $conv = intval($in / $raz);
     $in %= $raz;
     $descr = $ar_descr[ $this->DescrIdx($conv%100) ];
     if($conv >= 100)
     {
        $Sot = array(’сто’, ‘двести’, ‘триста’, ‘четыреста’, ‘пятьсот’,
        ‘шестьсот’, ‘семьсот’, ‘восемьсот’, ‘девятьсот’);
        $ret = $Sot[intval($conv/100) - 1] . ‘ ‘;
        $conv %= 100;
     }
     if($conv >= 10)
     {
        $i = intval($conv / 10);
        if($i == 1)
        {
           $DesEd = array(’десять’, ‘одиннадцать’, ‘двенадцать’, ‘тринадцать’,
           ‘четырнадцать’, ‘пятнадцать’, ‘шестнадцать’, ‘семнадцать’,
           ‘восемнадцать’, ‘девятнадцать’ );
           $ret .= $DesEd[ $conv - 10 ] . ‘ ‘;
           $ret .= $descr;
           // возвращаемся здесь
           return $ret;
        }
        $Des = array(’двадцать’, ‘тридцать’, ‘сорок’, ‘пятьдесят’, ‘шестьдесят’,
        ‘семьдесят’, ‘восемьдесят’, ‘девяносто’ );
        $ret .= $Des[$i - 2] . ‘ ‘;
     }
     $i = $conv % 10;
     if($i > 0)
     {
        if( $fem && ($i==1 || $i==2) )
        {
           // для женского рода (сто одна тысяча)
           $Ed = array(’одна’, ‘две’);
           $ret .= $Ed[$i - 1] . ‘ ‘;
        }
        else
        {
           $Ed = array(’один’, ‘два’, ‘три’, ‘четыре’, ‘пять’,
           ‘шесть’, ‘семь’, ‘восемь’, ‘девять’ );
           $ret .= $Ed[$i - 1] . ‘ ‘;
        }
     }
     $ret .= $descr;
     return $ret;
  }
  // IN: $sum - число, например 1256.18
  function Convert($sum)
  {
     $ret = ”;
     // имена данных перменных остались от предыдущей версии
     // когда скрипт конвертировал только денежные суммы
     $Kop = 0;
     $Rub = 0;
     $sum = trim($sum);
     // удалим пробелы внутри числа
     $sum = str_replace(’ ‘, ”, $sum);
     // флаг отрицательного числа
     $sign = false;
     if($sum[0] == ‘-’)
     {
        $sum = substr($sum, 1);
        $sign = true;
     }
     // заменим запятую на точку, если она есть
     $sum = str_replace(’,', ‘.’, $sum);
     $Rub = intval($sum);
     $Kop = $sum*100 - $Rub*100;
     if($Rub)
     {
        // значение $Rub изменяется внутри функции DescrSot
        // новое значение: $Rub %= 1000000000 для миллиарда
        if($Rub >= 1000000000)
        $ret .= $this->DescrSot($Rub, 1000000000,
        array(’миллиард’, ‘миллиарда’, ‘миллиардов’)) . ‘ ‘;
        if($Rub >= 1000000)
        $ret .= $this->DescrSot($Rub, 1000000,
        array(’миллион’, ‘миллиона’, ‘миллионов’) ) . ‘ ‘;
        if($Rub >= 1000)
        $ret .= $this->DescrSot($Rub, 1000,
        array(’тысяча’, ‘тысячи’, ‘тысяч’), true) . ‘ ‘;
        $ret .= $this->DescrSot($Rub, 1, $this->Mant) . ‘ ‘;
        // если необходимо поднимем регистр первой буквы
        $ret[0] = chr( ord($ret[0]) + ord(’A') - ord(’a') );
        // для корректно локализованных систем можно закрыть верхнюю строку
        // и раскомментировать следующую (для легкости сопровождения)
        // $ret[0] = strtoupper($ret[0]);
     }
     if($Kop < 10)
     $ret .= ‘0′;
     $ret .= $Kop . ‘ ‘ . $this->Expon[ $this->DescrIdx($Kop) ];
     // если число было отрицательным добавим минус
     if($sign)
     $ret = ‘-’ . $ret;
     return $ret;
  }
}
class ManyToText extends NumToText
{
  function ManyToText()
  {
     $this->SetMant( array(’рубль’, ‘рубля’, ‘рублей’) );
     $this->SetExpon( array(’копейка’, ‘копейки’, ‘копеек’) );
  }
}
class MetrToText extends NumToText
{
  function MetrToText()
  {
     $this->SetMant( array(’метр’, ‘метра’, ‘метров’) );
     $this->SetExpon( array(’сантиметр’, ‘сантиметра’, ‘сантиметров’) );
  }
}
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
</HEAD>
<BODY>
if( isset($HTTP_POST_VARS['num']) )
{
  $mt = new ManyToText();
  $nt = new MetrToText();
  echo $mt->Convert($HTTP_POST_VARS['num']) . ‘
’;
  echo $nt->Convert($HTTP_POST_VARS['num']) . ‘
’;
}
?>
<FORM ACTION ="" METHOD="post">
Input number:<BR />
<INPUT TYPE="text" NAME="num"><BR />
<INPUT TYPE="submit" VALUE=" GET ">
</FORM>
</BODY></HTML>

Если не использовать subclassing, то строку $mt = new ManyToText() замените на:

$mt = new NumToText();
$mt->SetMant( array(’рубль’, ‘рубля’, ‘рублей’) );
$mt->SetExpon( array(’копейка’, ‘копейки’, ‘копеек’) );
echo $mt->Convert($HTTP_POST_VARS['num']);

Категория: Sundry | Добавил: ya
Просмотров: 1095 | Загрузок: 0 | Комментарии: 1 |
Всего комментариев: 1
avatar
0
1 ДАША • 05:21, 08.11.2009
Люди помогите пожалуйста разобраться, что значит: Windows 1251 и расписать по байтам?!! Пожалуйстаа!!!








avatar
Форма входа
Поиск
Друзья сайта
Статистика
p
IP:54.235.48.106


Здесь и Сейчас: 1
Прохожих: 1
VIP: 0
l
n


Copyright Мир ВебМастера © 2018