4

我需要根据用户选择的语言在我的 Web 应用程序中格式化数字,例如德语中的 1234.56 = "1.234,56"。像这样的东西sprintf目前是没有问题的,因为它们依赖于 LC_NUMERIC(这对于桌面应用程序恕我直言)而且我必须在服务器上生成每个语言环境,这是不行的。我更喜欢使用CLDR的格式化字符串,但还没有找到合适的模块。简而言之,我想要的是:

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

如何正确地做到这一点?

4

3 回答 3

6

CPAN 现在有CLDR::Number用于基于 Unicode CLDR 的数字、百分比和货币格式。

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,因此您不必依赖不一致的操作系统语言环境数据。

于 2014-03-18T16:46:49.993 回答
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 子模块,然后在服务器上安装这些子模块。然后不需要语言环境。

我在某个地方也有一个修补过的,可以处理各种欧元。(现在如果只有作者会应用它;)

杰斯。

于 2009-04-29T13:28:12.260 回答
1

perldoc perllocale 状态:

setlocale 函数 您可以在运行时使用 POSIX::setlocale() 函数随时切换区域设置:

它还注意到模块 I18N::Langinfo,它逐个提供本地化数据。

于 2009-04-29T08:23:02.837 回答