2009-04-29 32 views
3

我需要根據用戶選擇的語言在我的Web應用程序中格式化數字,例如1234.56 =德語爲「1.234,56」。像sprintf這樣的東西目前是沒有問題的,因爲它們依賴於LC_NUMERIC(這對於桌面應用程序恕我直言,是明智的),並且我必須在服務器上生成每個區域設置,這是一個不行。我寧願使用CLDR的格式化字符串,但還沒有找到合適的模塊。我想要的是一個簡單的說法:如何在Perl中格式化數字語言環境特定的?

set_locale("de_DE"); 
print format_number(1234.56); 

如何正確地做到這一點?

+0

不幸的是CLDR :: Number不提供解析字符串並將它們轉換爲數字的可能性。好的,沒有被要求,但解析和格式是一對,是不是? (同樣適用於Number :: Format,AFAIK。) – user1774051 2015-01-21 14:53:01

回答

1

的perldoc perllocale手冊狀態:

setlocale函數 您可以隨時按照您的意願在運行時與 POSIX :: setlocale()函數切換區域設置:

它還注意到模塊I18N :: Langinfo,它提供了一塊一片的本地化數據。

+0

仍然需要在服務器上生成語言環境:( – 2009-04-29 09:01:05

+0

啊,我錯過了那個模塊。那麼,Locale :: Object帶有一個數據庫「並在隨附的DBD :: SQLite數據庫中提供「。 – Anonymous 2009-04-29 09:15:34

3
use POSIX qw(locale_h); 
use Math::Currency; 
set_locale(LC_ALL, "de_DE"); 
Math::Currency->localize(); 
my $eur = Math::Currency->new("1234.56"); 

print "$eur"; 

但是,這確實取決於現有的語言環境。查看Math :: Currency的文檔,瞭解如何首先爲您需要的所有數據生成Math :: Currency :: XX子模塊,然後將其安裝在服務器上。

我也有一個補丁,可以應付各種歐元。 (現在,如果只有作者會申請它;)

Jess。

6

對於基於Unicode CLDR的數字,百分比和貨幣格式,CPAN現在有CLDR::Number

use CLDR::Number; 
my $cldr = CLDR::Number->new(locale => 'de-DE'); # or 'de_DE' 

my $decf = $cldr->decimal_formatter; 
say $decf->format(1234.5); # '1.234,5' 

my $curf = $cldr->currency_formatter(currency_code => 'EUR'); 
say $curf->format(1234.5); # '1.234,50 €' 

$curf->locale('de-AT');  # Austrian German 
say $curf->format(1234.5); # '€ 1.234,50' 

CLDR ::數提供了所有其使用,目前由CDLR V27,所以你不必依靠不一致的操作系統區域設置數據的語言環境數據。

相關問題