ugrás a tartalomhoz

Szám szöveggé konvertálása

Scr34m · 2004. Ápr. 6. (K), 10.38
Nincs valakinek egy meglévő kódja, algoritmusa ennek elkészítésére ?

5985 -> ötezer kilencszáznyolcvanöt
 
1

de van de van

bbalint · 2004. Ápr. 7. (Sze), 15.00
cső!

itt van, amit még annak idején a 2003-as phpconfra küldtem, 5 compótnak:

(NOTE: ez egy működő verzió, HTML dolgokat tessék türülni + a szam függvényt meghívni, pl szam(211), szam(1231456234))

<?php
 function ido(){
  list($s, $ms) = explode(' ', microtime());

  return((float) $s + (float) $ms);
 }

 $ido = ido();

 $szamok = array();
 $szamok['0'] = 'nulla';
 $szamok['1'] = 'egy';
 $szamok['2'] = 'kettő';
 $szamok['3'] = 'három';
 $szamok['4'] = 'négy';
 $szamok['5'] = 'öt';
 $szamok['6'] = 'hat';
 $szamok['7'] = 'hét';
 $szamok['8'] = 'nyolc';
 $szamok['9'] = 'kilenc';
 $szamok['10'] = 'tíz';
 $szamok['20'] = 'húsz';
 $szamok['30'] = 'harminc';
 $szamok['40'] = 'negyven';
 $szamok['50'] = 'ötven';
 $szamok['60'] = 'hatvan';
 $szamok['70'] = 'hetven';
 $szamok['80'] = 'nyolcvan';
 $szamok['90'] = 'kilencven';
 $szamok['100'] = 'száz';
 $szamok['1000'] = 'ezer';
 $szamok['1000000'] = 'millió';
 $szamok['1000000000'] = 'milliárd';
 $szamok['1000000000000'] = 'trillió';
 $szamok['1000000000000000'] = 'quadrillió';
 $szamok['1000000000000000000'] = 'quintillió';
 $szamok['1000000000000000000000'] = 'sextrillió';
 $szamok['1000000000000000000000000'] = 'septrillió';
 $szamok['1000000000000000000000000000'] = 'oktrillió';

 function tortel($tort){
  global $tortek;

  $tortek[] = $tort;
  $tortek[] = 'tíz'.$tort;
  $tortek[] = 'szaz'.$tort;
 }

 $tortek = array();
 $tortek[] = 'tized';
 $tortek[] = 'szazad';

 tortel('ezred');
 tortel('millimod');
 tortel('milliardod');
 tortel('trilliomod');
 tortel('quadrilliomod');
 tortel('quintrilliomod');
 tortel('sextrilliomod');
 tortel('septrilliomod');
 tortel('oktrilliomod');

 function szam_1($szam, $darabszam = 0){
  global $szamok;

  if(!$szam)
   return($szamok['0']);
  if(($szam == '2') && ($darabszam & 1))
   return('két');
  return($szamok[$szam]);
 }

 function szam_2($szam, $darabszam = 0){
  global $szamok;

  if(!$szam[1])
   return($szamok[$szam[0].'0']);

  switch($szam[0]){
   case '1': $return = 'tizen'; break;
   case '2': $return = 'huszon'; break;
   default: $return = $szamok[$szam[0].'0']; break;
  }

  if($szam[1])
   $return .= szam_1($szam[1], $darabszam);
  return($return);
 }

 function szam_3($szam, $darabszam = 0){
  global $szamok;

  if(($szam[0] != '1') || ($darabszam & 2))
   $return = szam($szam[0], 1);
  @$return .= $szamok['100'];
  if($szam = intval($szam[1].$szam[2]))
   $return .= szam(strval($szam), $darabszam);
  return($return);
 }

 function szam_4($szam, $darabszam = 0){
  global $szamok;

  if((intval($szam) > 1999) || ($darabszam & 4))
   $return = szam(intval(substr($szam, -strlen($szam), strlen($szam) - 3)), 1);
  @$return .= $szamok['1000'];
  if($tmp = intval(substr($szam, -3, 3))){
   if(intval($szam) > 1999)
    $return .= ' - ';
   $return .= szam(strval($tmp), $darabszam);
  }
  return($return);
 }

 function szam_5($szam, $darabszam = 0){return szam_4($szam, $darabszam);}
 function szam_6($szam, $darabszam = 0){return szam_4($szam, $darabszam);}

 function _szam($szam, $darabszam = 0){
  global $szamok;

  $strlen = intval(strlen($szam) / 3) * 3;
  if($strlen == strlen($szam))
   $strlen -= 3;
  if(!($darabszam & 8))
   $return = szam(intval(substr($szam, 0, strlen($szam) - $strlen)), 1);
  if(($darabszam & 16) && preg_match('/^[0-9]0+$/', $szam))
   @$return .= ' ';
  @$return .= $szamok['1'.str_repeat('0', $strlen)];
  if(($tmp = szam(substr($szam, -$strlen), $darabszam)) && ($tmp != $szamok['0']))
   $return .= ' - '.$tmp;
  return($return);
 }

 function szam($szam, $darabszam = 0){
  if(!strlen($szam = preg_replace('/^0+0/', '0', $szam)))
   return(null);
  if($szam[0] == '-')
   return('mínusz '.szam(substr($szam, 1), $darabszam));
  if(count($tmp = preg_split('/\./', $szam, 2)) - 1){
   global $szamok, $tortek;

   $tort = @$tortek[strlen($tmp[1] = preg_replace('/0+$/', '', $tmp[1])) - 1];
   if(($tmp[1] = szam(intval($tmp[1]))) && ($tmp[1] != $szamok['0']))
    return szam($tmp[0]).' egész '.$tmp[1].' '.$tort;
   $szam = $tmp[0];
  }
  $szam = preg_replace('/^0+0/', '0', $szam);
  if(($tmp = strlen($szam)) < 7)
   return(call_user_func('szam_'.$tmp, $szam, $darabszam));
  return(_szam($szam,$darabszam));
 }
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="hu" lang="hu">
 <head>
  <title>[teszt] :: [szám-konverter]</title>
  <style type="text/css">
  <!--
   b,body,font,form,input{
    cursor:default;
   }
   input{
    border: 2px groove #cccccc;
    background-color: #000000;
    color: #ffffff;
    font-family: Verdana, Arial Narrow, Sans-serif;
    font-size: 11px;
   }
  -->
  </style>
 </head>
 <body bgcolor="#2a2a2a" text="gray">
  <form action="szam.php" method="get">
   <font face="Verdana,Arial Narrow,Sans-serif" size="1">
    szám konverter :<b>: [teszt]</b><br />
    írj be egy számot, és nyomj a mehet-re:<br />
    <br />
    <input type="text" name="n" size="68" value="<?
     if(isset($_GET['n']))
      print($_GET['n']);
    ?>" maxlength="61" /><br />
    <input type="submit" value="mehet" /><?php
     if(preg_match('/n=(\-?)(0*)(\d+)(\.(\d+))?/', $_SERVER['QUERY_STRING'], $m) && (strlen($m[3]) <= 30) && (@strlen($m[5]) <= 29)){
      $darabszam = 0;
      if(@is_array($_GET['d']))
       $darabszam |= array_sum($_GET['d']);
      print('<br />
    <br />
    <b>['.$_GET['n'].'] :</b>: '.szam($m[1].$m[3].@$m[4], $darabszam));
     }
    ?><br />
    <br />
    <b>[</b> ez a weblap kb. <?php print(substr(strval(ido() - $ido), 0, 8)); ?> másodperc alatt lett generálva. <b>]</b>
   </font>
  </form>
 </body>
</html>
2

Itt egy másik "azaz" függvény

szagabesz · 2009. Szep. 15. (K), 10.48
PHP környezetben számot szöveggé. Nyomtatott számlákra például.

Nekem nem működött bbalint verziója, íme egy osztályba foglalt, rövidebb kód. A legnagyobb szám, amit még képes szöveggé alakítani: 999999999999

használata:

$converter = new Azaz();
echo $converter->toString(65486);
echo $converter->toString(999999999999);
echo $converter->toString(-1111);
echo $converter->toString(-4569845);
íme az osztály:


class Azaz
{

  public function  __construct()
  {
    $this->EgyesStr = array('', 'egy', 'kettő', 'három', 'négy', 'öt', 'hat', 'hét', 'nyolc', 'kilenc');
    $this->TizesStr = array('', 'tíz', 'húsz', 'harminc', 'negyven', 'ötven', 'hatvan', 'hetven', 'nyolcvan', 'kilencven');
    $this->TizenStr = array('', 'tizen', 'huszon', 'harminc', 'negyven', 'ötven', 'hatvan', 'hetven', 'nyolcvan', 'kilencven');
  }

  public static function toString($Mit)
  {
    $this->Mit = $Mit;
    $this->Result = '';
    if ($Mit == 0)
    {
      $this->Result = 'Nulla';
    }
    else
    {
      $this->Maradek = abs($this->Mit);
      if ($this->Maradek > 999999999999)
      {
        throw new Exception('Túl nagy szám: '.$this->Maradek);
      }
      $this->Alakit($this->Maradek, 1000000000, 'milliárd');
      $this->Alakit($this->Maradek, 1000000, 'millió');
      $this->Alakit($this->Maradek, 1000, 'ezer');
      $this->Alakit($this->Maradek, 1, '');
      $this->Result = ucfirst($this->Result);
      if ( $Mit < 0 )
        $this->Result = 'Mínusz ' . $this->Result;
    }
    
    return $this->Result;
  }


  protected function Alakit($Maradek, $Oszto, $Osztonev)
  {
    if ( $Maradek >= $Oszto)
    {
      if ( mb_strlen($this->Result) > 0 )
        $this->Result = $this->Result . '-';

      $this->Mit = $Maradek / $Oszto;
      if ( $this->Mit >= 100)
        $this->Result = $this->Result . $this->EgyesStr[$this->Mit / 100] . 'száz';

      $this->Mit = $this->Mit % 100;
      if ($this->Mit % 10 !== 0)
        $this->Result = $this->Result . $this->TizenStr[$this->Mit / 10] . $this->EgyesStr[$this->Mit % 10] . $Osztonev;
      else
        $this->Result = $this->Result . $this->TizesStr[$this->Mit / 10] . $Osztonev;
    }

    $this->Maradek = $this->Maradek % $Oszto;
  }

}