2009-04-29 18 views
3

ユーザーの選択した言語に応じて、Webアプリケーションで数値をフォーマットする必要があります。 1234.56 = "1.234,56"(ドイツ語)。彼らはLC_NUMERIC(これはデスクトップアプリケーションのIMHOにとって賢明です)に依存しているため、sprintfのようなものは現在問題になっていません。サーバー上のすべてのロケールを生成する必要があります。 CLDRの書式設定文字列を使用することをお勧めしますが、適切なモジュールが見つかりませんでした。私が望むものは簡単です:Perlで数値ロケール固有の書式を設定するにはどうすればよいですか?

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

これはどうやって正しくできますか?状態はperllocale

+0

残念ながら、CLDR :: Numberは文字列を解析して数字に変換する可能性はありません。さて、それは求められていませんでしたが、解析と書式設定はペアになっていますか? (同じことがNumber :: Format、AFAIKに適用されます) – user1774051

答えて

1

はperldoc:

はsetlocale機能 あなたは POSIX ::のsetlocale()関数で、実行時にできるだけ頻繁にあなたが望むようにロケールを切り替えることができます

それもノートモジュールI18N :: Langinfoは、1つ1つのローカライズデータを提供します。

+0

まだロケールがサーバー上に生成されている必要があります:( –

+0

ああ、私はそのモジュールでそれを見逃しました。付随するDBD :: SQLiteデータベースで提供されています " – Anonymous

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 :: XXサブモジュールを生成する方法については、Math :: Currencyのドキュメントを参照してください。次に、それらをサーバーにインストールしてください。

私はまた、いろいろな種類のEURに対応しているパッチを貼っています。 (今作者だけがそれを適用するならば)

ジェス。

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から、使用するすべてのロケールデータを提供します。

+1

今日、オラフ・アンダースの不思議なことに、[自分のコミット機能の作成をやめる](http://www.olafalders.com/2015/09/04/stop-writing-your -own-commify-functions /) –

関連する問題