3 回答
TA贡献1777条经验 获得超10个赞
我找到了解决方案。Symfony/Form有一个很棒的功能,可以添加视图转换器,它在渲染表单元素之前渲染。
这是我的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,但可以帮助我解决我的问题。
TA贡献1796条经验 获得超10个赞
这里真正的问题是,根据给定的语言环境,输出NumberFormatter应该是人类可读的,而不一定可以解析为数字。
您可以通过覆盖该符号来解决此特定问题:
$formatter = new \NumberFormatter('lt', \NumberFormatter::DECIMAL);
$formatter->setSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL, '-');
$value = $formatter->format('-150');
var_dump($value); // string(4) "-150"
但是,请考虑千位分隔符或小数分隔符,它们也不一定在 JavaScript 中进行解析:
$formatter = new \NumberFormatter('lt', \NumberFormatter::DECIMAL);
$formatter->setSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL, '-');
$value = $formatter->format('-150000.5');
var_dump($value); // string(11) "-150 000,5"
您也可以覆盖这些符号,但这里的要点是,您可能应该根据用户的区域设置有一个人类可读的版本,以及一个由 JavaScript 解析的单独的机器可读版本。
如果您仍然想用来NumberFormatter输出机器可读的版本,您可以使用'en'区域设置,但您仍然需要覆盖分组分隔符:
$machineFormatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL);
$machineFormatter->setSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '');
- 3 回答
- 0 关注
- 91 浏览
添加回答
举报