簡體   English   中英

如何更改接受空格和非空格的NumberFormatter :: parseCurrency()行為?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM