php - 如何使用 Smarty 将数字转换为 PHP 中的单词?
问题描述
我有一些代码可以将包含两位小数的数字转换为单词。
但是,当前代码有问题。它为每个数字添加了额外的千,因此此代码错误地将例如 15,000.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;
}
?>
我该如何解决?
解决方案
您可以将问题陈述简化为“如何将字符串 '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"
推荐阅读
- reactjs - React Navigation 删除以前的路线并转到以前的两倍?
- android - 如何通过支付金额以及如何在应用内支付 sdk 中获取 transaction_id?
- javascript - 如何使用 setTimeout 函数延迟重定向到多个网站?
- javascript - 如何阻止用户输入 0-1 和不是 az 的字符以及捕捉粘贴?(Vue)
- c# - 为什么 GetTextInRun() 方法在“ö”、“ü”或/和“ä”处停止?
- python - 是否可以通过装饰器将实例方法注册为信号接收器?
- delphi - Delphi 10.2 主题 - “light” vsd “dark”
- jelastic - 阻止来自互联网的网络流量(公共访问)
- arrays - 循环的数组输入覆盖值
- regex - 正则表达式获取模式的最后一个匹配项