#!/usr/bin/perl -w use strict; use utf8; # /=====================================================================\ # # | Copyright (C) 2007 Ioan A. Sucan, | # # | This program converts numbers up to one million into Romanian words | # # | Released under the GNU General Public License | # # |---------------------------------------------------------------------| # # | Ioan A. Sucan #_# | # # | http://ioan.sucan.info (o o) | # # \=========================================================ooo==U==ooo=/ # my %numbers = (0 => 'zero', 1 => 'unu', 2 => 'doi', 3 => 'trei', 4 => 'patru', 5 => 'cinci', 6 => 'șase', 7 => 'șapte', 8 => 'opt', 9 => 'nouă', 10 => 'zece', 11 => 'unsprezece', 12 => 'doisprezece', 13 => 'treisprezece', 14 => 'paisprezece', 15 => 'cincisprezece', 16 => 'șaisprezece', 17 => 'șaptesprezece', 18 => 'optsprezece', 19 => 'nouăsprezece'); use constant TEN => 10; use constant HUNDRED => 100; use constant THOUSAND => 1000; use constant MILLION => 1000000; use constant BILLION => 1000000000; sub convert { my ($nr, $mark) = @_; $mark = 'm' unless $mark; return 'două' if ($mark ne 'm' && $nr == 2); return 'una' if ($mark eq 'f' && $nr == 1); return $numbers{$nr} if $nr < 20; if ($nr < HUNDRED) { my $rest = $nr % TEN; my $tens = ($nr - $rest) / TEN; my $result = convert($tens, 'f').'zeci'; $result .= ' și '.convert($rest, $mark) if $rest > 0; return $result; } if ($nr < THOUSAND) { my $rest = $nr % HUNDRED; my $hundreds = ($nr - $rest) / HUNDRED; my $result = $hundreds == 1 ? 'o sută' : convert($hundreds, 'f').' sute'; return $rest > 0 ? $result.' '.convert($rest, $mark) : $result; } if ($nr < MILLION) { my $rest = $nr % THOUSAND; my $thousands = ($nr - $rest) / THOUSAND; my $result; if ($thousands == 1) { $result = 'o mie'; } else { $result = convert($thousands, 'f'); $result .= ($thousands % 100 < 20 && $thousands % 100 > 0) ? ' mii' : ' de mii'; } return $rest > 0 ? $result.' '.convert($rest, $mark) : $result; } if ($nr < BILLION) { my $rest = $nr % MILLION; my $million = ($nr - $rest) / MILLION; my $result; if ($million == 1) { $result = 'un milion'; } else { $result = convert($million, 'n'); $result .= ($million % 100 < 20 && $million % 100 > 0) ? ' milioane' : ' de milioane'; } return $rest > 0 ? $result.' '.convert($rest, $mark) : $result; } return 'un miliard' if $nr == BILLION; 'infinit'; } my $nr = ; chomp($nr); binmode STDOUT, ":utf8"; print $nr < 0 ? 'minus '.convert(-$nr) : convert($nr), "\n";