我遇到了一个问题,Symfony/Form 在引擎盖下使用NumberFormatter
来格式化NumberType
字段。我们的项目是多语言的,对于每个国家,我们使用不同的语言环境。$formatter->format()
返回负数的不同负号。举例来说:
$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL);
$value = $formatter->format('-150');
var_dump($value); // string(4) "-150"
$formatter = new \NumberFormatter('lt', \NumberFormatter::DECIMAL);
$value = $formatter->format('-150');
var_dump($value); // string(6) "−150" <-- here is the problem
正如您所看到的,NumberFormatter
将减号更改为其他符号。
为什么这对我很重要?因为页面上的一些元素是用JavaScript生成的,js无法解析−150
number并返回NaN
。
有人能解释一下这种行为的原因吗?以及如何从NumberFormatter
中为 lt locale获取正确的减号?
3条答案
按热度按时间eiee3dmh1#
我找到解决办法了 Symfony/Form 有一个很棒的功能,就是添加一个view transformers,它会在呈现表单元素之前呈现。
以下是我的
FormType
:这种方法允许覆盖
\Symfony\Component\Form\Extension\Core\Type\NumberType
的默认视图Transformer,该转换器添加了特定的减号。需要说明的是,在自定义表单中添加的view Transformer的优先级高于任何其他合并的transformer。
它不能解决
NumberFormatter
的问题,但可以帮助我解决我的问题。pdsfdshx2#
如何转换为ascii?
正在工作example。
输出
参考文献
jhkqcmku3#
这里真实的的问题是,根据给定的语言环境,
NumberFormatter
的输出应该是人类可读的,而不一定是可解析为数字的。\u2212
是表示减号的合适Unicode符号,但实际上只有少数地区使用它。您可以通过覆盖符号来修复此特定问题:
然而,考虑千位分隔符或小数分隔符,它们也不一定在JavaScript中解析:
您也可以覆盖这些符号,但这里的要点是,您可能应该根据用户的区域设置提供一个人类可读的版本,并提供一个单独的机器可读版本供JavaScript解析。
如果你仍然想使用
NumberFormatter
来输出机器可读的版本,你可以使用'en'
环境,但你仍然需要覆盖分组分隔符: