【问题标题】:NumberFormatter: strange behaviour with a minus sign in different localesNumberFormatter:在不同语言环境中带有减号的奇怪行为
【发布时间】:2020-11-27 20:14:05
【问题描述】:

我遇到了 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数字并返回NaN

有人可以解释这种行为的原因以及如何从NumberFormatter 获得lt 语言环境的正确减号吗?

【问题讨论】:

标签: javascript php locale number-formatting


【解决方案1】:

我找到了解决方案。 Symfony/Form 有一个很棒的功能可以添加一个view transformers,它会在渲染表单元素之前被渲染。

这是我的FormType

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('amount', NumberType::class, array(
        'required' => true,
        'scale' => 4,
    ));

    $builder->get('amount')->addViewTransformer(new CallbackTransformer(
        function ($forward) {
            // Transform the lithuanian minus sign to the normal minus sign.
            return preg_replace('/\x{2212}/u', '-', $forward);
        },
        function ($reverse) {
            return $reverse;
        }
    ));

    // others form elements...
}

这种方法允许覆盖 \Symfony\Component\Form\Extension\Core\Type\NumberType 的默认视图转换器,其中添加了特殊的减号。

$builder->addViewTransformer(new NumberToLocalizedStringTransformer(
    $options['scale'],
    $options['grouping'],
    $options['rounding_mode'],
    $options['html5'] ? 'en' : null
));

需要明确的是,在自定义表单中添加的视图转换器比任何其他合并的转换器具有更高的优先级。

它一般不能解决NumberFormatter 的问题,但可以帮助我解决问题。

【讨论】:

    【解决方案2】:

    转成ascii怎么样?

    $formatter = new \NumberFormatter('lt', \NumberFormatter::DECIMAL);
    $value = $formatter->format('-150');
    $valueAsAscii = iconv('utf8', 'ascii//translit', $value);
    
    var_dump($value);
    var_dump($valueAsAscii);
    

    工作example

    输出

    string(6) "−150"
    string(4) "-150"
    

    参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多