#!/usr/bin/perl -w use strict; use utf8; # /=====================================================================\ # # | Copyright (C) 2007 Ioan A. Sucan, | # # | This program converts numbers up to one million into French words | # # | Released under the GNU General Public License | # # |---------------------------------------------------------------------| # # | Ioan A. Sucan #_# | # # | http://ioan.sucan.info (o o) | # # \=========================================================ooo==U==ooo=/ # my %numbers = (0 => 'zéro', 1 => 'un', 2 => 'deux', 3 => 'trois', 4 => 'quatre', 5 => 'cinq', 6 => 'six', 7 => 'sept', 8 => 'huit', 9 => 'neuf', 10 => 'dix', 11 => 'onze', 12 => 'douze', 13 => 'treize', 14 => 'quatorze', 15 => 'quinze', 16 => 'seize', 17 => 'dix-sept', 18 => 'dix-huit', 19 => 'dix-neuf'); my %tens = (2 => 'vingt', 3 => 'trente', 4 => 'quarante', 5 => 'cinquante', 6 => 'soixante', 8 => 'quatre-vingt'); use constant TEN => 10; use constant HUNDRED => 100; use constant THOUSAND => 1000; use constant MILLION => 1000000; use constant BILLION => 1000000000; sub convert { my ($nr) = @_; return $numbers{$nr} if $nr < 20; if ($nr < 70) { my $rest = $nr % TEN; my $ten = ($nr - $rest) / TEN; my $result = $tens{$ten}; $result .= ' et '.$numbers{$rest} if $rest == 1; $result .= '-'.$numbers{$rest} if $rest > 1; return $result; } return $tens{6}.'-'.$numbers{$nr - 60} if $nr < 80; return $tens{8}.'-'.$numbers{$nr - 80} if $nr < HUNDRED; if ($nr < THOUSAND) { my $rest = $nr % HUNDRED; my $hundreds = ($nr - $rest) / HUNDRED; my $result = ($hundreds == 1 ? '' : convert($hundreds).' ').'cent'; $result .= 's' if ($hundreds > 1 && $rest == 0); $result .= ' '.convert($rest) if $rest != 0; return $result; } if ($nr < MILLION) { my $rest = $nr % THOUSAND; my $thousands = ($nr - $rest) / THOUSAND; return ($thousands == 1 ? '' : convert($thousands).' '). 'mille'.($rest > 0 ? ' '.convert($rest) : ''); } if ($nr < BILLION) { my $rest = $nr % MILLION; my $million = ($nr - $rest) / MILLION; my $result = convert($million).' million'.($million == 1 ? '' : 's'); $result .= ' '.convert($rest) if $rest > 0; return $result; } return 'un milliard' if $nr == BILLION; 'infinite'; } my $nr = ; chomp($nr); binmode STDOUT, ":utf8"; print $nr < 0 ? 'minus '.convert(-$nr) : convert($nr), "\n";