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貢獻1757條經驗 獲得超7個贊

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 關注
- 133 瀏覽
添加回答
舉報