亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

NumberFormatter:在不同區域設置中帶有減號的奇怪行為

NumberFormatter:在不同區域設置中帶有減號的奇怪行為

PHP
繁星點點滴滴 2023-09-22 14:57:22
我遇到了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無法解析?150number 并返回NaN。有人可以解釋這種行為的原因以及如何從 lt 語言環境中獲得正確的減號嗎?NumberFormatter
查看完整描述

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,但可以幫助我解決我的問題。


查看完整回答
反對 回復 2023-09-22
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

轉換成ascii怎么樣?


$formatter = new \NumberFormatter('lt', \NumberFormatter::DECIMAL);

$value = $formatter->format('-150');

$valueAsAscii = iconv('utf8', 'ascii//translit', $value);


var_dump($value);

var_dump($valueAsAscii);

工作

查看完整回答
反對 回復 2023-09-22
?
白衣染霜花

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, '');


查看完整回答
反對 回復 2023-09-22
  • 3 回答
  • 0 關注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號