Как мне отформатировать число в зависимости от локали в Perl? - PullRequest
3 голосов
/ 29 апреля 2009

Мне нужно отформатировать числа в моем веб-приложении в зависимости от выбранного пользователем языка, например, 1234,56 = "1,234,56" на немецком языке. Такие вещи, как sprintf, в настоящее время не подлежат обсуждению, поскольку они зависят от LC_NUMERIC (что целесообразно для настольных приложений, IMHO), и мне придется генерировать все языковые стандарты на сервере, что не требуется. Я бы предпочел использовать строки форматирования CLDR , но не нашел подходящий модуль. То, что я хотел бы иметь в двух словах:

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

Как это сделать правильно?

Ответы [ 3 ]

6 голосов
/ 18 марта 2014

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, поэтому вам не нужно полагаться на несовместимые данные о локали операционной системы.

3 голосов
/ 29 апреля 2009
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.

1 голос
/ 29 апреля 2009

perldoc perllocale состояний:

Функция setlocale Вы можете переключать локали так часто, как вы хотите во время выполнения с помощью Функция POSIX :: setlocale ():

Он также отмечает модуль I18N :: Langinfo, который предоставляет данные локализации по частям.

...