如何使用Smarty在PHP中将数字转换为单词?

如何使用Smarty在PHP中将数字转换为单词?,php,smarty,Php,Smarty,我有一些代码可以将包含两位小数的数字转换为单词 但是,当前的代码有问题。它会在每个数字上增加1000,因此该代码错误地将15000.00转换为1500万 我试过改变数字 function smarty_modifier_no2words($number, $uk = 0) { if (!is_string($number)) $number.= ""; if (!$uk) $many = array('', ' thousand ', ' million ', ' billion

我有一些代码可以将包含两位小数的数字转换为单词

但是,当前的代码有问题。它会在每个数字上增加1000,因此该代码错误地将15000.00转换为1500万

我试过改变数字

function smarty_modifier_no2words($number, $uk = 0) {
    if (!is_string($number)) $number.= "";
    if (!$uk) $many = array('', ' thousand ', ' million ', ' billion ', ' trillion');
    else $many = array('', ' thousand ', ' million ', ' milliard ', ' billion ');
    $string = '';
    if (strlen($number) % 3 != 0) {
        $string.= smarty_modifier_no2words_hunderds(substr($number, 0, strlen($number) % 3));
        $string.= $many[floor(strlen($number) / 3) ];
        for ($i = 0;$i < floor(strlen($number) / 3);$i++) {
            $string.= smarty_modifier_no2words_hunderds(substr($number, strlen($number) % 3 + ($i * 3), 3));
            if ($number[strlen($number) % 3 + ($i * 3) ] != 0) $string.= $many[floor(strlen($number) / 3) - 1 - $i];
        }
        return $string;
    }
    function smarty_modifier_no2words_hunderds($number) {
        $test = $number * 1;
        if (empty($test)) return;
        $lasts = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');
        $teens = array('eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen');
        $teen = array('ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety');
        $string = '';
        $j = strlen($number);
        $done = false;
        for ($i = 0;$i < strlen($number);$i++) {
            if ($j == 2) {
                if (strlen($number) > 2) {
                    if ($number[0] != 0) $string.= ' hundred ';
                    if (substr($number, $i + 1)) $string.= 'and ';
                }
                if ($number[$i] == 1) {
                    if ($number[$i + 1] == 0) $string.= $teen[$number[$i] - 1];
                    else {
                        $string.= $teens[$number[$i + 1] - 1];
                        $done = true;
                    }
                } else {
                    if (!empty($teen[$number[$i] - 1])) $string.= $teen[$number[$i] - 1] . ' ';
                }
            } elseif ($number[$i] != 0 && !$done) $string.= $lasts[$number[$i] - 1];
            $j--;
        }
        return $string;
    }
?>
函数智能修饰符2字($number,$uk=0){
如果(!is_string($number))$number.=“”;
if(!$uk)$many=array(“‘千’、‘百万’、‘十亿’、‘万亿’);
else$many=数组(“‘千’、‘百万’、‘百万’、‘十亿’);
$string='';
如果(strlen($number)%3!=0){
$string.=smarty_修饰符_no2words_hunderds(substr($number,0,strlen($number)%3));
$string.=$many[楼层(strlen($number)/3)];
对于($i=0;$i2){
如果($number[0]!=0)$string.='hunded';
if(substr($number,$i+1))$string.='和';
}
如果($number[$i]==1){
如果($number[$i+1]==0)$string.=$teen[$number[$i]-1];
否则{
$string.=$tenties[$number[$i+1]-1];
$done=true;
}
}否则{
如果(!empty($teen[$number[$i]-1])$string.=$teen[$number[$i]-1].';
}
}elseif($number[$i]!=0&&!$done)$string.=$lasts[$number[$i]-1];
$j--;
}
返回$string;
}
?>

如何修复它?

您可以将您的问题陈述简化为“如何将字符串“15000.00”转换为数字?”,快速而肮脏的答案是:

(float)preg_replace('/[^\d\-\.]/', '', $input);
尽管处理大多数可能导致问题的边缘情况的成熟解决方案要长得多

但是你已经展示了第二个问题,你使用字符串函数来处理数字,这对我来说总是一个巨大的危险信号。使用数学:

$input = 15000.00;
$magnitudes = ['', 'thousand', 'million', 'billion'];
$magnitude = (int)(log($input, 10) / 3);
$factor = $input/pow(10,$magnitude*3);

var_dump(sprintf("%d %s", $factor, $magnitudes[$magnitude]));
输出:

string(11) "15 thousand"
string(90) "one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine"
即使如此,这个问题仍然是:

输出:

string(11) "15 thousand"
string(90) "one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine"