【问题标题】:PHP NumberFormatter.format() shows strange outputPHP NumberFormatter.format() 显示奇怪的输出
【发布时间】: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 上运行。我完全不知道泰米尔语会在哪里以及为什么会发挥作用,以及为什么它只影响整数。

显然,我做错了什么,但我不知道在哪里。有什么想法或建议可以去哪里看?

【问题讨论】:

    标签: php locale number-formatting


    【解决方案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 效果很好!
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多