带有序数的数字格式化程序的行为不一致

Posted

技术标签:

【中文标题】带有序数的数字格式化程序的行为不一致【英文标题】:Inconsistent behaviour for number formatter with ordinal 【发布时间】:2016-05-13 11:15:37 【问题描述】:

我今天遇到了最奇怪的事情,我不知道该怎么办。

这是我的代码:

<?php 
$nf = new \NumberFormatter("en_UK", \NumberFormatter::ORDINAL);
die(var_dump($nf->format(1)));

此代码在 PHP 版本 5.6.20 中输出以下内容:

字符串(3)“第一个”

但它在 PHP 5.6.14 版本中输出以下内容:

字符串(6) "1ˢᵗ"

我不知道该怎么做。上标版本是我没想到的。我浏览了更改日志,但没有看到此更改记录在案。任何人都知道这是否是预期的行为?有什么方法可以强制它回到第一个行为(因为在表单中呈现它时看起来很奇怪)?

PHP 5.6.20 安装使用 ICU 版本 4.8.1.1,而 5.6.14 使用 ICU 版本 4.4.0.1

【问题讨论】:

【参考方案1】:

我只是升级到新的 ICU。

奇怪的上标是在CLDR 2.0 中修复的,它是在几年前在this ticket 中引入的。我不确定是哪个 CLDR 版本介绍了它,但不幸的是,我的名字是审稿人。也许当时这似乎是个好主意。

这是来自CLDR 的数据而不是代码,通常我们不会为每个数据更改创建更改日志条目。

【讨论】:

以上是关于带有序数的数字格式化程序的行为不一致的主要内容,如果未能解决你的问题,请参考以下文章

在Java中格式化带有小数位的数字符号而不进行除法的正确方法

SQL Server标量函数将数字转换为带有序数的单词

Apps 脚本:带有文本的自定义数字格式

使用带有特殊字符的正则表达式进行数字格式化

如何将给定的序数(来自 Excel)转换为日期

大厂必备!mysql数字格式化输出