| Lingua-EN-Numbers-Years documentation | Contained in the Lingua-EN-Numbers-Years distribution. |
Lingua::EN::Numbers::Years - turn "1984" into "nineteen eighty-four", etc
use Lingua::EN::Numbers::Years; my $x = 1803; print "I'm old! I was born in ", year2en($x), "!\n";
prints:
I'm old! I was born in eighteen oh three!
Lingua::EN::Numbers::Years turns numbers that represent years, into English text.
It exports one function, year2en, which takes a scalar value
and returns a scalar value. The return value is the English text expressing that
year-number; or if what you provided wasn't a number, then it returns undef.
Unless the input is an at-most five-digit integer (with commas allowed), then
year2en just returns Lingua::EN::Number::num2en(value), as a reasonable
fall-through.
This module is necessary because English pronounces year-numbers differently from normal numbers. So the year 1984 was pronounced "nineteen eighty-four", never "one thousand, nine hundred and eighty-four".
This module makes guesses as to how to pronounce year-numbers between
ten thousand and a hundred thousand -- so year2num(10191) returns
"ten thousand one ninety-one". But clearly these are not established in English
usage. Yet.
Note that year2en doesn't try to append "BC" or "AD".
Lingua::EN::WordsToNumbers
Copyright (c) 2005, Sean M. Burke, author of the later versions.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself (perlartistic).
This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose.
(But if you have any problems with this library, I ask that you let me know.)
Sean M. Burke, sburke@cpan.org
| Lingua-EN-Numbers-Years documentation | Contained in the Lingua-EN-Numbers-Years distribution. |
require 5; # Time-stamp: "2005-01-05 18:20:32 AST" package Lingua::EN::Numbers::Years; require Exporter; @ISA = qw(Exporter); use strict; use Lingua::EN::Numbers 1.01 qw(num2en); use vars qw( @EXPORT @EXPORT_OK $VERSION %DD %D %OhDD $T $H $Oh $Zero); $T = "thousand"; $H = "hundred"; $Oh = "oh"; $Zero = "zero"; $VERSION = '1.01'; @EXPORT = qw(year2en); BEGIN { *DEBUG = sub () {0} unless defined &DEBUG } # setup a DEBUG constant #-------------------------------------------------------------------------- @DD{ '00' .. '09' } = @DD{ '0' .. '9' } = @D{ '0' .. '9' } = @OhDD{ '0' .. '9' } = qw(oh one two three four five six seven eight nine); @OhDD{ '00' .. '09' } = map "$Oh $_", @D{ '0' .. '9' }; # Altho "oh oh" presumably is never used for my $num ('10' .. '99') { $OhDD{$num} = $DD{$num} = num2en($num); DEBUG > 1 and print "$num = $DD{$num}\n"; } #-------------------------------------------------------------------------- sub year2en ($) { my $y = $_[0]; return undef unless defined $y and length $y; $y =~ s/,//g; if( $y =~ m/\d/ and $y =~ m/^(-?)(\d{1,5})$/s ) { my $neg = $1 ? "negative " : ''; local $_ = $2; return $Zero if $_ eq '0'; return "$neg$DD{$_}" if $DD{$_}; m/^(..)000$/ and return "$neg$DD{$1} $T"; if( m/^.0...$/ ) { # A family of troublesome cases: things like "60123". # We can't say "sixty one twenty-three" because that sounds # just like sixty-one twenty-three. So we special-case this # whole group. m/^(.0)000$/ and return "$neg$DD{$1} $T"; m/^(.0)00(.)$/ and return "$neg$DD{$1} $T $D{$2}"; m/^(.0)0(..)$/ and return "$neg$DD{$1} $T $DD{$2}"; m/^(.0)(.)00$/ and return "$neg$DD{$1} $T $D{$2} $H"; m/^(.0)(.)(..)$/ and return "$neg$DD{$1} $T $D{$2} $OhDD{$3}"; DEBUG and print "Falling thru with x0,xxx number $_ !\n"; } m/^(.)000$/ and return "$neg$DD{$1} $T"; m/^(..)00$/ and return "$neg$DD{$1} $H"; m/^(.)00$/ and return "$neg$DD{$1} $H"; m/^(..)00(.)$/ and return "$neg$DD{$1} $Oh $Oh $DD{$2}"; m/^(..)0(..)$/ and return "$neg$DD{$1} $Oh $DD{$2}"; m/^(.)00(.)$/ and return "$neg$DD{$1} $T $DD{$2}"; #m/^(..)00(.)$/ and return "$neg$DD{$1} $T $DD{$2}"; m/^(..)(.)(..)$/ and return "$neg$OhDD{$1} $D{$2} $OhDD{$3}"; m/^(..)(..)$/ and return "$neg$OhDD{$1} $OhDD{$2}"; m/^(.)(..)$/ and return "$neg$OhDD{$1} $OhDD{$2}"; # Else fallthru: } if(DEBUG) { my $x = num2en($y); print "Using superclass to return numerification \"$x\".\n"; return $x; } else { return num2en($y); } } #-------------------------------------------------------------------------- 1; __END__