PHP 'NumberFormatter' 'SPELLOUT' 没有提供所需的英文格式

Posted

技术标签:

【中文标题】PHP \'NumberFormatter\' \'SPELLOUT\' 没有提供所需的英文格式【英文标题】:PHP 'NumberFormatter' 'SPELLOUT' is not providing required format in englishPHP 'NumberFormatter' 'SPELLOUT' 没有提供所需的英文格式 【发布时间】:2019-08-06 06:39:03 【问题描述】:

我在我的代码中使用 php NumberFormatter 将价格值转换为文字 例如,如果是 125 卢比,那么应该是“一百二十五”而不是“一百二十五”。

我已经尝试过其他示例,例如检查每个数字单位值并替换单词

$numberFormatterClass = new \NumberFormatter("en", \NumberFormatter::SPELLOUT);
echo str_replace('-', ' ', $numberFormatterClass->format($number));

期望 125 = “一百二十五”

【问题讨论】:

@KIKOSoftware,不检查十进制值。而不是寻找我提到的格式。 好的,我明白了,问题是什么。 为什么是 str_replace?我尝试了没有代码,它也是一样的。你只想要绝对值吗? 确保您已经安装了 php-intl 包(php5-intl、php7.0-intl 等) 【参考方案1】:

当数字大于 99 时,您只能生成最后两位数字的拼写。然后你就知道在哪里插入“和”了。在代码中:

$number = 125;

$numberFormatter = new \NumberFormatter('en', \NumberFormatter::SPELLOUT);
$fullSpellout = str_replace('-', ' ', $numberFormatter->format($number));
if ($number > 100) 
   $lastTwoSpellout = str_replace('-', ' ', $numberFormatter->format(substr($number, -2)));
   $hunderdsLength = strlen($fullSpellout) - strlen($lastTwoSpellout); 
   $fullSpellout = substr($fullSpellout, 0, $hunderdsLength) . 'and ' . $lastTwoSpellout; 


echo $fullSpellout;

这个输出:

one hundred and twenty five

这当然不是唯一可能的解决方案。插入“and”的方法有很多,如果最后两位数字总是生成两个单词,您也可以使用它来检测插入“and”的位置。

这是一个基于单词并使用数组插入'and'的版本:

$number = 125;

$numberFormatter = new \NumberFormatter('en', \NumberFormatter::SPELLOUT);
$spellout = str_replace('-', ' ', $numberFormatter->format($number));
if ($number > 100) 
   $words = explode(' ', $spellout); 
   array_splice($words, -2, 0, ['and']);
   $spellout = implode(' ', $words); 


echo $spellout;

【讨论】:

确保您已经安装了 php-intl 包(php5-intl、php7.0-intl 等) 我认为这行不通。 NumberFormatter 不使用减号,而是在数字之间使用 utf8 软连字符。所以str_replace('-', '', $str); 将不起作用。而是做preg_replace('~\x00AD~u', '', $str); 工作。不确定这是否是语言环境的问题。

以上是关于PHP 'NumberFormatter' 'SPELLOUT' 没有提供所需的英文格式的主要内容,如果未能解决你的问题,请参考以下文章

php numberformatter 显示零

如何在 SwiftUI 中使用 NumberFormatter?

numberformatter(样式货币)删除不起作用

NumberFormatter 分组未按预期工作

NumberFormatter 参数标签 '(_:)' 不匹配任何可用的重载

来自 NumberFormatter 的本地化货币符号