繁体   English   中英

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

[英]How can I convert a number to words in PHP using Smarty?

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

但是,当前代码有问题。 它为每个数字增加了一个额外的千,因此此代码错误地将例如15,000.00转换为1,500万

我试图改变数字。

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;
    }
?>

我该如何解决?

您可以将问题陈述简化为“如何将字符串'15,000.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"

甚至仍然可以解决此问题:

$f = new NumberFormatter("en", NumberFormatter::SPELLOUT);
var_dump($f->format(123456789));

输出:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM