[英]How can I change NumberFormatter::parseCurrency() behavior of accepting white space and non breaking space?
我正在嘗試將本地化的貨幣字符串解析為貨幣和浮動值。
一切都運作良好,現在我們遇到了一些問題。 看起來NumberFormatter :: parseCurrency使用了一個額外的不可見字符:
Testcode:
<?php
$formatter = new NumberFormatter("de_DE", NumberFormatter::CURRENCY);
var_dump(array(
$formatter->parseCurrency("88,22 €", $curr), // taken from output of $formatter->format(88.22)
$formatter->parseCurrency("88,22 €", $curr), // input with keyboard
$formatter->parseCurrency("88,22 \xE2\x82\xAc", $curr), // just a test
$formatter->format(88.22),
"88,22 €" // keyboard input
));
輸出:
array(5) {
[0]=> float(88,22)
[1]=> bool(false)
[2]=> bool(false)
[3]=> string(10) "88,22 €" // this as input works
[4]=> string(9) "88,22 €" // this not...
}
如您所見,輸出3和4的字符串長度存在差異。
我在PHP 5.3(啟用了mbstring的ubuntu)和5.4(Mac OS X上的Zend Server)中得到了相同的結果。
主要問題是,來自我的表單(ZF1應用程序)的輸入值與索引4的輸出相同...
有什么建議? 提前致謝
EDIT1:
工作價值的hexdump:
00000000 38 38 2c 32 32 c2 a0 e2 82 ac 0a |88,22......|
0000000b
非工作價值的hexdump:
00000000 38 38 2c 32 32 20 e2 82 ac 0a |88,22 ....|
0000000a
EDIT2:
使用的whitepsace似乎是一個問題。 c2 a0是NO-BREAK SPACE,並且(可能?)是NumberFormatter :: parseCurrency()所必需的。 但0x20是默認空格(在輸入表單中輸入)。 當前的解決方法是使用$value = str_replace("\\x20", "\\xC2\\xA0", $value);
將NO-BREAK SPACE替換為空格$value = str_replace("\\x20", "\\xC2\\xA0", $value);
EDIT3:
在另一個系統(帶有Zend Server 5.6的Mac OS X,啟用了mbstring,PHP 5.3.14)中,一切都按預期工作:
array(5) {
[0]=> float(88,22)
[1]=> float(88,22)
[2]=> float(88,22)
[3]=> string(9) "88,22 €"
[4]=> string(9) "88,22 €"
}
Edit4:
使用空間和使用非中斷空間配置之間的主要區別是ICU版本:
工作版:
intl
Internationalization support => enabled
version => 1.1.0
ICU version => 3.8.1
Directive => Local Value => Master Value
intl.default_locale => no value => no value
intl.error_level => 0 => 0
不工作版本:
intl
Internationalization support => enabled
version => 1.1.0
ICU version => 4.8.1.1
ICU Data version => 4.8.1
Directive => Local Value => Master Value
intl.default_locale => no value => no value
intl.error_level => 0 => 0
NumberFormatter::parseCurrency
是ICU庫函數unum_parseDoubleCurrency
一個瘦包裝器( 參見source )。
ICU庫函數是限制性的,因為它只解析由其雙重函數unum_formatDoubleCurrency
引起的字符串。 格式由Unicode語言環境數據驅動,該數據指定貨幣值和數值之間的不間斷空格。 顯然,該庫的早期版本接受了其他空白字符。
簡而言之,您不能使NumberFormatter::parseCurrency
接受空格。 但是, Zend_Currency
默認情況下也應該輸出不間斷的空格:
$currency = new Zend_Currency(array(
'currency' => 'EUR',
'value' => 88.22,
), 'de_DE');
var_dump(
strval($currency), // 88,22 €
strpos($currency, "\x20"), // false
strpos($currency, "\xc2\xa0") // 5
);
問題是您的應用程序的哪一部分正在輸出空格以及您如何解決它。 你提到它是表單的一部分,所以也許你可以看一下表單將貨幣和值作為單獨的字段返回,這樣你就不必擔心解析數字了。 如果用戶自己輸入字符串“88,22€”,則可能會遇到更多問題,而不僅僅是空白問題。 話雖如此,你提到的解決方法(用\\x20
\\xc2\\xa0
替換\\x20
)是解決這個問題的唯一方法,如果你想使用NumberFormatter
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.