模式}}}}123
在ICU DecimalFormat中是有效的语法,因为}
在填充字符的合法范围内。可以在PHP中进行如下验证:
$f = new NumberFormatter('en_GB', NumberFormatter::PATTERN_DECIMAL, '*}######0');
$this->assertSame('}}}}123', $f->format(123));
-------
correct
但是将其嵌入ICU MessageFormat中时,我们遇到的问题是,大括号字符过早地结束了参数,需要转义。
再次,使用PHP验证这是否引发IntlException:
$f = new MessageFormatter('en_GB', "{0,number,*}######0}");
$this->assertSame('}}}}123', $f->format([123]));
根据ICU MessageFormat语法引用格式也不起作用,因为在DecimalFormat语法中,引用符号是无效的 padChar 。总之,这些都不起作用:
{0,number,*}######0}
{0,number,*'}'######0}
{0,number,'*}######0'}
DecimalFormat语法似乎与MessageFormat的 argStyleText 语法不兼容。
这是PHP的Intl扩展中的错误,还是有办法逃避消息中的十进制模式?
请注意,这是有关ICU MessageFormat的学术问题,我并不是在问如何在PHP中填充整数。