2009-04-29 2 views
3

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

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

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

+0

К сожалению, CLDR :: Number не предоставляет возможности анализировать строки и преобразовывать их в числа. Ладно, этого не просили, но разбор и форматирование - это пара, не так ли? (То же самое относится к Number :: Format, AFAIK.) – user1774051

ответ

1

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

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

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

+0

По-прежнему требуется создание локалей на сервере :( –

+0

А, я пропустил это для этого модуля. Ну, Locale :: Object поставляется с базой данных, «собранной из нескольких источников» и предоставлены в базе данных 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 о том, как создавать подмножества Math :: Currency :: XX для всех данных, которые вам нужны в первую очередь, а затем устанавливать их на сервере .. тогда не нужны локали.

У меня также есть пропатченный где-то, который справляется с различными видами EUR. (Теперь, если только автор применит его;)

Jess.

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

+1

Любопытно, что от Олафа Андерса сегодня: [Прекратить писать свои функции Commify] (http://www.olafalders.com/2015/09/04/stop-writing-your -Собственная-commify-функция /) –

Смежные вопросы