code.fastix.org

Dateiansicht:

Datei:Projekte -> PHP:Umrechnung zwischen Zahlensystemen -> romanNumbers.php
md5:437c1ace8f14686650a563690f922644
sha1:62b463789d658f591e38bbe046b7096423bde42b
  1. <?php
  2. /**
  3. * @author: Jörg Reinholz, fastix WebDesign & Consult, Kassel - http://www.fastix.org/
  4. * @version: 1.0.9
  5. * @licence: https://code.fastix.org/lizenz.php
  6. **/
  7.  
  8. class romanNumbers
  9.  
  10. {
  11.     private $hash;
  12.     public  $getAsEntitiesDefault = false;
  13.     public  $getShortDefault      = true;
  14.  
  15.     function __construct () {
  16.         $this -> roman['h'] = 100000;
  17.         $this -> roman['a'] = 50000;
  18.         $this -> roman['z'] = 10000;
  19.         $this -> roman['f']  = 5000;
  20.         $this -> roman['Z']  = 2000; #old
  21.        $this -> roman['M']  = 1000;
  22.         $this -> roman['A']  = 500; # old
  23.        $this -> roman['D']  = 500;
  24.         $this -> roman['Q']  = 500; #old
  25.        $this -> roman['G']  = 400; #old
  26.        $this -> roman['P']  = 400; #old
  27.        $this -> roman['B']  = 300; #old
  28.        $this -> roman['E']  = 250; #old
  29.        $this -> roman['H']  = 200; #old
  30.        $this -> roman['T']  = 160; #old
  31.        $this -> roman['K']  = 151; #old
  32.        $this -> roman['Y']  = 150; #old
  33.        $this -> roman['C']  = 100;
  34.         $this -> roman['N']  = 90; #old
  35.        $this -> roman['R']  = 80; #old
  36.        $this -> roman['S']  = 70; #old
  37.        $this -> roman['L']  = 50;
  38.         $this -> roman['F']  = 40; #old
  39.        $this -> roman['O']  = 11; #old
  40.        $this -> roman['X']  = 10;
  41.         $this -> roman['V']  = 5;
  42.         $this -> roman['I']  = 1;
  43.      }
  44.  
  45.     function getDec($str) {
  46.         $str = $this -> toEntities($str);
  47.  
  48.         $arSearch = array(
  49.             'CCCI&#8579;&#8579;&#8579;',  '(((I)))', '&#8584;',  # 100.000
  50.            'I&#8579;&#8579;&#8579;',     'I)))',    '&#8583;',  # 50.000
  51.            'CCI&#8579;&#8579;',          '((I))',   '&#8578;',  # 10.000
  52.            'I&#8579',                    'I))',     '&#8577;',  # 5.000
  53.            'CI&#8579;',                  '(I)',     '&#8576;', '&Phi;',  # 1.000
  54.            'X/',                   # 15
  55.            '&bull;M','*M','&#8845;', ' N ',   # Tausender-Trennzeichen
  56.            '&#1055;',
  57.             '&#1064;',
  58.             '&#1059;',
  59.             '1',
  60.             ' '
  61.         );
  62.  
  63.         $arReplace = array(
  64.             'h','h', 'h',    # 100.000
  65.            'a','a', 'a',    # 50.000
  66.            'z','z', 'z',    # 10.000
  67.            'f','f', 'f',    # 5.000
  68.            'M','M', 'M', 'M',  # 1.000
  69.            'XV',            # 15
  70.            '$', '$', '$', '$', # Tausender-Trennzeichen
  71.            'II',
  72.             'III',
  73.             'V',
  74.             'I',
  75.             ''
  76.         );
  77.  
  78.         $str = str_replace($arSearch, $arReplace, $str);
  79.  
  80.         if (strpos ($str, '$')  ) {
  81.             $parts = explode('$', $str);
  82.             $ret=0;
  83.             $faktor = pow(1000, count($parts) - 1 );
  84.             for ( $i = 0; $i < count($parts); $i++ ) {
  85.                 $z = $this -> getDec($parts[$i]) * $faktor;
  86.                 $faktor = $faktor / 1000;
  87.                 $ret += $z;
  88.             }
  89.             return $ret;
  90.         }
  91.  
  92.         $strLat = '';
  93.         for ( $i=0; $i < strlen($str); $i++ ) {
  94.             $c = $str[$i];
  95.             if ($c) {
  96.                 if ( isset( $this -> roman[$c] ) ) {
  97.                     $strLat .= $c;
  98.                 } else {
  99.                     #trigger_error('class romanNumbers, function getDec: Unknown char "'.$c.'" ignored.', E_USER_NOTICE );
  100.                }
  101.             }
  102.         }
  103.  
  104.  
  105.         $str  = strrev($strLat);
  106.         $roman = $this -> roman; # Benutze Kopie!
  107.        $dec  = 0;
  108.         for ($i = 0; $i < strlen($str); $i++ ) {
  109.             $c = $str[$i];
  110.             if (! isset($roman[$c])) { echo " $str \n";}
  111.             $dec += $roman[$c];
  112.             if ( 'V' == $c || 'X' == $c )       $roman['I'] = -1;
  113.             elseif ( 'C' == $c || 'L' == $c )   $roman['X'] = -10;
  114.             elseif ( 'M' == $c || 'D' == $c )   $roman['C'] = -100;
  115.             elseif ( 'z' == $c || 'f' == $c )   $roman['M'] = -1000;
  116.             elseif ( 'h' == $c || 'a' == $c )   $roman['z'] = -10000;
  117.         }
  118.         return $dec;
  119.     }
  120.  
  121.     function getRoman ($int, $getAsEntities=false, $getLong=false) {
  122.         if ( $int != floor($int) ) {
  123.             trigger_error('class romanMumbers, function getRoman: Fatal error: Romaniens don\'t know floats!', E_USER_NOTICE);
  124.             return false;
  125.         }
  126.         if ( $int < 0 ) {
  127.             trigger_error('class romanMumbers, function getRoman: Fatal error: Romaniens don\'t know negative Numbers!', E_USER_NOTICE);
  128.             return false;
  129.         }
  130.         if ( $int < 0 ) {
  131.             trigger_error('class romanMumbers, function getRoman: Fatal error: Its true, the Romaniens don\'t know the zero!', E_USER_NOTICE);
  132.             return false;
  133.         }
  134.         if ( $int > PHP_INT_MAX ) {
  135.             trigger_error ( 'class: romanMumbers, function: getString :: Es wurde eine zu große Zahl ('.$int.') übergeben. Maximum ist '. PHP_INT_MAX , E_USER_ERROR );
  136.         }
  137.         $str = '';
  138.         while ( $int >= 100000 ) {
  139.             $str .= 'ↈ';
  140.             $int = $int - 100000;
  141.         }
  142.         while ( $int >= 50000 ) {
  143.             $str .= 'ↇ';
  144.             $int = $int - 50000;
  145.         }
  146.         while ( $int >= 10000 ) {
  147.             $str .= 'ↂ';
  148.             $int = $int - 10000;
  149.         }
  150.         while ( $int >= 5000 ) {
  151.             $str .= 'ↁ';
  152.             $int = $int - 5000;
  153.         }
  154.         while ( $int >= 1000 ) {
  155.             $str .= 'M';
  156.             $int = $int - 1000;
  157.         }
  158.         while ( $int >= 500 ) {
  159.             $str .= 'D';
  160.             $int = $int - 500;
  161.         }
  162.         while ( $int >= 100 ) {
  163.             $str .= 'C';
  164.             $int = $int - 100;
  165.         }
  166.         while ( $int >= 50 ) {
  167.             $str .= 'L';
  168.             $int = $int - 50;
  169.         }
  170.         while ( $int >= 10 ) {
  171.             $str .= 'X';
  172.             $int = $int - 10;
  173.         }
  174.         while ( $int >= 5 ) {
  175.             $str .= 'V';
  176.             $int = $int - 5;
  177.         }
  178.         while ( $int >= 1 ) {
  179.             $str .= 'I';
  180.             $int = $int - 1;
  181.         }
  182.  
  183.  
  184.         if ( $this->getShortDefault and ! $getLong ) {
  185.             $arSearch = array (
  186.                 'VIIII',    # 9
  187.                'IIII',     # 4
  188.                'LXXXX',    # 90
  189.                'XXXX',     # 40
  190.                'DCCCC',    # 900
  191.                'CCCC',     # 400
  192.                'ↁMMMM',    # 9000
  193.                'MMMM',     # 4000
  194.                'ↇↂↂↂↂ', # 90000
  195.                'ↂↂↂↂ'  # 40000
  196.            );
  197.  
  198.             $arReplace = array (
  199.                 'IX',       #9
  200.                'IV',       #4
  201.                'XC',       #90
  202.                'XL',       #40
  203.                'CM',       #900
  204.                'CD',       #400
  205.                'Mↂ',      #9000
  206.                'Mↁ',       #4000
  207.                'ↂↈ',      #90000
  208.                'ↂↇ'       #40000
  209.            );
  210.             $str = str_replace( $arSearch, $arReplace, $str );
  211.         }
  212.         if ( $getAsEntities or $this -> getAsEntitiesDefault ) {
  213.             $str = $this -> toEntities($str);
  214.         }
  215.         return $str;
  216.     }
  217.  
  218.  
  219.     private function toEntities($str) {
  220.         if ( function_exists( 'recode_string' ) )               return recode_string("utf-8..html", $str);
  221.         elseif (function_exists( 'mb_convert_encoding' ) )      return mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8' );
  222.         else                                                    return htmlentities( $str, ENT_SUBSTITUTE );
  223.     }
  224. }