我需要根据用户选择的语言格式化我的网络应用中的数字,例如1234.56 =“1.234,56”德文像sprintf
这样的东西目前是不可能的,因为它们依赖于LC_NUMERIC(这对于桌面应用程序IMHO是明智的)而且我必须在服务器上生成每个语言环境,这是不行的。我更喜欢使用CLDR的格式化字符串,但没有找到合适的模块。我想拥有的是一个简单的说法:
set_locale("de_DE");
print format_number(1234.56);
如何正确地做到这一点?
答案 0 :(得分: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 :: Number提供它使用的所有语言环境数据,目前来自CDLR v27,因此您不必依赖于不一致的操作系统语言环境数据。
答案 1 :(得分: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子模块,然后在服务器上安装这些子模块。然后不需要语言环境。
我也有一个补丁,可以应付各种各样的欧元。 (现在,如果只有作者会应用它;)
尔杰斯。
答案 2 :(得分:1)
perldoc perllocale声明:
setlocale函数 您可以在运行时随意切换区域设置 POSIX :: setlocale()函数:
它还注意到模块I18N :: Langinfo,它逐段提供本地化数据。