このトピックは既に提起されていることは知っていますが、提案されたオプションと以前使用した機能により、タスクをより簡単に、よりエレガントに解決できるという感覚が残りました。 だから私は座って、タスクを分析し、別の
使用例:
num2str(878867.15); // 15
さらに、コード自体...
/** * * @author runcore * @uses morph(...) */ function num2str($num) { $nul=''; $ten=array( array('','','','','','','','', '',''), array('','','','','','','','', '',''), ); $a20=array('','','','','' ,'','','','',''); $tens=array(2=>'','','','','','' ,'',''); $hundred=array('','','','','','','', '','',''); $unit=array( // Units array('' ,'' ,'', 1), array('' ,'' ,'' ,0), array('' ,'' ,'' ,1), array('' ,'','' ,0), array('','','',0), ); // list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num))); $out = array(); if (intval($rub)>0) { foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols if (!intval($v)) continue; $uk = sizeof($unit)-$uk-1; // unit key $gender = $unit[$uk][3]; list($i1,$i2,$i3) = array_map('intval',str_split($v,1)); // mega-logic $out[] = $hundred[$i1]; # 1xx-9xx if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99 else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9 // units without rub & kop if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]); } //foreach } else $out[] = $nul; $out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub $out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop return trim(preg_replace('/ {2,}/', ' ', join(' ',$out))); } /** * * @ author runcore */ function morph($n, $f1, $f2, $f5) { $n = abs(intval($n)) % 100; if ($n>10 && $n<20) return $f5; $n = $n % 10; if ($n>1 && $n<5) return $f2; if ($n==1) return $f1; return $f5; }
UPD1:固定設計+小さな関数のリファクタリング
UPD2:深いリファクタリングにより、アルゴリズムを大幅に短縮/簡素化できます