home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / Numbers / Roman.php
PHP Script  |  2001-01-10  |  4KB  |  147 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP version 4.0                                                      |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2001 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Sterling Hughes <sterling@php.net>                          |
  17. // +----------------------------------------------------------------------+
  18. //
  19.  
  20. require_once("PEAR.php");
  21.  
  22. // {{{ Numbers_Roman
  23.  
  24. /**
  25.  * The Numbers_Roman class provides utilities to convert roman numerals to 
  26.  * arabic numbers and convert arabic numbers to roman numerals
  27.  *
  28.  * @access public
  29.  * @author Sterling Hughes <sterling@php.net>
  30.  * @since  PHP 4.0.5
  31.  */
  32. class Numbers_Roman extends PEAR
  33. {
  34.     // {{{ toNumber()
  35.     
  36.     /**
  37.      * Converts a roman numeral to a number
  38.      *
  39.      * @param  string  $roman The roman numeral to convert
  40.      *
  41.      * @return integer $num   The number corresponding to the
  42.      *                        given roman numeral
  43.      *
  44.      * @access public
  45.      * @author Sterling Hughes <sterling@php.net>
  46.      * @since  PHP 4.0.5
  47.      */
  48.     function toNumber($roman)
  49.     {
  50.         $conv = array(
  51.             array("letter" => 'I', "number" => 1),
  52.             array("letter" => 'V', "number" => 5),
  53.             array("letter" => 'X', "number" => 10),
  54.             array("letter" => 'L', "number" => 50),
  55.             array("letter" => 'C', "number" => 100),
  56.             array("letter" => 'D', "number" => 500),
  57.             array("letter" => 'M', "number" => 1000),
  58.             array("letter" => 0,   "number" => 0)
  59.         );
  60.         $arabic = 0;
  61.         $state  = 0;
  62.         $sidx   = 0;
  63.         $len    = strlen($roman);
  64.     
  65.         while ($len >= 0) {
  66.             $i = 0;
  67.             $sidx = $len;
  68.             
  69.             while ($conv[$i]['number'] > 0) {
  70.                 if (strtoupper($roman[$sidx]) == $conv[$i]['letter']) {
  71.                     if ($state > $conv[$i]['number']) {
  72.                         $arabic -= $conv[$i]['number'];
  73.                     } else {
  74.                         $arabic += $conv[$i]['number'];
  75.                         $state   = $conv[$i]['number'];
  76.                     }
  77.                 }
  78.                 $i++;
  79.             }
  80.  
  81.             $len--;
  82.         }
  83.     
  84.         return($arabic);
  85.     }
  86.  
  87.     // }}}
  88.     // {{{ toRoman()
  89.     
  90.     /**
  91.      * Converts a number to its roman numeral representation
  92.      *
  93.      * @param  integer $num   An integer between 0 and 3999 inclusive
  94.      *                        that should be converted to a roman numeral
  95.      *
  96.      * @return string  $roman The corresponding roman numeral
  97.      *
  98.      * @access public
  99.      * @author Sterling Hughes <sterling@php.net>
  100.      * @since  PHP 4.0.5
  101.      */
  102.     function toRoman($num) {
  103.         $conv = array(10 => array('X', 'C', 'M'),
  104.                       5  => array('V', 'L', 'D'),
  105.                       1  => array('I', 'X', 'C'));
  106.         $roman = '';
  107.         
  108.         $num = (int) $num;
  109.  
  110.         $digit  = (int) $num / 1000;
  111.         $num   -= $digit * 1000;
  112.         while ($digit > 0) {
  113.             $roman .= 'M';
  114.             $digit--;
  115.         }
  116.  
  117.         for ($i = 2; $i >= 0; $i--) {
  118.             $power = pow(10, $i);
  119.             $digit = (int) $num / $power;
  120.             $num -= $digit * $power;
  121.  
  122.             if (($digit == 9) || ($digit == 4)) {
  123.                 $roman .= $conv[1][$i] . $conv[$digit+1][$i];
  124.             } else {
  125.                 if ($digit >= 5) {
  126.                     $roman .= $conv[5][$i];
  127.                     $digit -= 5;
  128.                 }
  129.  
  130.                 while ($digit > 0) {
  131.                     $roman .= $conv[1][$i];
  132.                     $digit--;
  133.                 }
  134.         }
  135.  
  136.         if ($num > 0) {
  137.             return('');
  138.         }
  139.  
  140.         return($roman);
  141.     }
  142.     
  143.     // }}}
  144. }
  145.  
  146. // }}}
  147. ?>