2009-08-18 1 views
6

Мне нужен код в моей программе, который принимает число в качестве входных данных и преобразует его в соответствующий текст, например. 745 - «семьсот сорок пять».Как преобразовать число в текст в Perl?

Теперь я могу написать код для этого, но есть ли какая-либо библиотека или существующий код, который я могу использовать?

+1

Работая над проблемой, уе Эйлера проекта? – dala

+0

related: http://stackoverflow.com/questions/309884/code-golf-number-to-words –

ответ

17

От perldoc из Lingua::EN::Numbers:

use Lingua::EN::Numbers qw(num2en num2en_ordinal); 

my $x = 234; 
my $y = 54; 
print "You have ", num2en($x), " things to do today!\n"; 
print "You will stop caring after the ", num2en_ordinal($y), ".\n"; 

печатает:

You have two hundred and thirty-four things to do today! 
You will stop caring after the fifty-fourth. 
1

Вы можете попробовать что-то вроде этого:

#!/usr/bin/perl 

use strict; 
use warnings; 

my %numinwrd = (
    0 => 'Zero', 1 => 'One', 2 => 'Two', 3 => 'Three', 4 => 'Four', 
    5 => 'Five', 6 => 'Six', 7 => 'Seven', 8 => 'Eight', 9 => 'Nine', 
); 

print "The number when converted to words is 745=>".numtowrd(745)."\n"; 

sub numtowrd { 
    my $num = shift; 
    my $txt = ""; 
    my @val = $num =~ m/./g; 

    foreach my $digit (@val) {  
    $txt .= $numinwrd{$digit} . " "; 
    } 

    return $txt; 
} 

Выход:

The number when converted to words is 745=>Seven Four Five 
+0

Чтобы преобразовать '@ val' в' $ txt', может быть проще сделать '$ txt = join" " , map {$ numinwrd {$ _}} @ val', эффективно сделав ваш sub одним слоем. Кроме того, это решение не создает «семьсот сорок пять». – amon

+0

Вы можете указать код, если вы можете сделать вывод до семисот сорока пяти – user1613245