PHP NumberFormatter.format() 显示奇怪的输出
Posted
技术标签:
【中文标题】PHP NumberFormatter.format() 显示奇怪的输出【英文标题】:PHP NumberFormatter.format() shows strange output 【发布时间】:2021-02-19 15:35:25 【问题描述】:我在 php 函数中有以下代码:
$fmt = NumberFormatter::create('de_DE', NumberFormatter::FRACTION_DIGITS);
echo $fmt->format(15);
输出是两个奇怪的字符:௰௫
,我发现它是泰米尔语数字中的 15。如果我将第二行中的数字更改为小数,即。 e.
$fmt = NumberFormatter::create('de_DE', NumberFormatter::FRACTION_DIGITS);
echo $fmt->format(15.5);
然后,我得到了预期的德语结果15,50
。
这一切都在带有德语键盘的英语 Ubuntu VM 上运行。我完全不知道泰米尔语会在哪里以及为什么会发挥作用,以及为什么它只影响整数。
显然,我做错了什么,但我不知道在哪里。有什么想法或建议可以去哪里看?
【问题讨论】:
【参考方案1】:您做错的是您使用的常量并非用于创建 NumberFormatter
对象。如果你看一下构造函数签名:
public static NumberFormatter::create ( string $locale , int $style , string $pattern = ? ) : NumberFormatter
您会看到第二个参数是要应用的样式。 manual 将样式定义为以下常量之一:
numfmt_create() 使用这些样式来定义格式化程序的类型。
NumberFormatter::PATTERN_DECIMAL (int)
由模式定义的十进制格式
NumberFormatter::DECIMAL (int)
十进制格式
NumberFormatter::CURRENCY (int)
货币格式
NumberFormatter::PERCENT (int)
百分比格式
NumberFormatter::SCIENTIFIC (int)
科学格式
NumberFormatter::SPELLOUT (int)
基于规则的拼写格式
NumberFormatter::ORDINAL (int)
基于顺序规则的格式
NumberFormatter::DURATION (int)
持续时间基于规则的格式
NumberFormatter::PATTERN_RULEBASED (int)
由模式定义的基于规则的格式
NumberFormatter::CURRENCY_ACCOUNTING (int)
用于记帐的货币格式,例如,($3.00) 表示负货币金额,而不是 -$3.00。自 PHP 7.4.1 和 ICU 53 起可用。
NumberFormatter::DEFAULT_STYLE (int)
语言环境的默认格式
NumberFormatter::IGNORE (int)
PATTERN_DECIMAL 的别名
如您所见,NumberFormatter::FRACTION_DIGITS
不是其中之一。稍后在以下句子标记的部分中提到了这一点:
numfmt_get_attribute() 和 numfmt_set_attribute() 使用的数字格式属性。
所以你真正需要做的是选择一个样式常量并使用它。
不过,它唤起了泰米尔语数字会发生什么,我无法理解。如果你看一下dumps of the constants,这个常量的值是 8,并且没有一个样式常量对应于那个数字。我不知道 PHP 如何处理 8 作为那里的输入值。它可能会提出一个有趣的问题。
【讨论】:
使用NumberFormatter::create('de_DE', NumberFormatter::PATTERN_DECIMAL)
代替 FRACTION_DIGITS 效果很好!以上是关于PHP NumberFormatter.format() 显示奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章
IntelliJ IDEA 11编辑php是,支持php文件名为.php5和.php4,如何设置能让其也支持.php呢?