3 回答

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
我找到了解決方案。Symfony/Form有一個(gè)很棒的功能,可以添加視圖轉(zhuǎn)換器,它在渲染表單元素之前渲染。
這是我的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...
}
這種方法允許覆蓋默認(rèn)的視圖轉(zhuǎn)換器,為其\Symfony\Component\Form\Extension\Core\Type\NumberType添加特定的減號(hào)。
$builder->addViewTransformer(new NumberToLocalizedStringTransformer(
? ? $options['scale'],
? ? $options['grouping'],
? ? $options['rounding_mode'],
? ? $options['html5'] ? 'en' : null
));
需要明確的是,以自定義表單添加的視圖轉(zhuǎn)換器比任何其他合并的轉(zhuǎn)換器具有更高的優(yōu)先級(jí)。
它一般不能解決 的問題NumberFormatter,但可以幫助我解決我的問題。

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
這里真正的問題是,根據(jù)給定的語言環(huán)境,輸出NumberFormatter應(yīng)該是人類可讀的,而不一定可以解析為數(shù)字。
您可以通過覆蓋該符號(hào)來解決此特定問題:
$formatter = new \NumberFormatter('lt', \NumberFormatter::DECIMAL);
$formatter->setSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL, '-');
$value = $formatter->format('-150');
var_dump($value); // string(4) "-150"
但是,請考慮千位分隔符或小數(shù)分隔符,它們也不一定在 JavaScript 中進(jìn)行解析:
$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"
您也可以覆蓋這些符號(hào),但這里的要點(diǎn)是,您可能應(yīng)該根據(jù)用戶的區(qū)域設(shè)置有一個(gè)人類可讀的版本,以及一個(gè)由 JavaScript 解析的單獨(dú)的機(jī)器可讀版本。
如果您仍然想用來NumberFormatter輸出機(jī)器可讀的版本,您可以使用'en'區(qū)域設(shè)置,但您仍然需要覆蓋分組分隔符:
$machineFormatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL);
$machineFormatter->setSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '');
- 3 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報(bào)