能否通过PHP NumberFormatter的setPattern方法实现数值对应单复数词显示?
用PHP的NumberFormatter实现单复数自动切换
嘿,当然可以实现!不过你当前写的#0.# page(s)这种硬加括号的方式没法自动根据数值切换单复数,得用ICU DecimalFormat内置的复数选择模式来做,这才是正确的姿势。
核心思路
ICU的复数格式化规则允许你根据数值所在的复数类别(比如one、other,不同语言的类别会有差异),自动匹配对应的文本格式。对于法语(fr_FR)来说,只有数值1属于one类别,其他所有数值(包括0、小数)都属于other类别,刚好符合你要的“大于1时显示复数”的需求。
正确代码示例
$sizeFormatter = new NumberFormatter('fr_FR', NumberFormatter::DECIMAL); // 使用ICU复数选择模式定义格式 $sizeFormatter->setPattern('{0, plural, one {#0.# page} other {#0.# pages}}'); // 测试不同场景 echo $sizeFormatter->format(1); // 输出: 1 page echo $sizeFormatter->format(2); // 输出: 2 pages echo $sizeFormatter->format(1.5); // 输出: 1,5 pages echo $sizeFormatter->format(0); // 输出: 0 pages(法语中0搭配复数)
模式语法解释
{0, plural, ...}:声明对第一个参数(即要格式化的数值)应用复数规则one {#0.# page}:当数值属于one类别时,使用这个格式(法语里仅数值1触发)other {#0.# pages}:其他所有数值场景,使用这个复数格式
额外提示
如果需要针对特定数值(比如0)做自定义格式,可以在模式里添加zero分支,比如:
$sizeFormatter->setPattern('{0, plural, zero {Aucune page} one {#0.# page} other {#0.# pages}}'); echo $sizeFormatter->format(0); // 输出: Aucune page
内容的提问来源于stack exchange,提问作者Seb33300
相关产品推荐
相关产品推荐

