Lingua::EN::Numbers::Years - turn "1984" into "nineteen eighty-four", etc


Lingua-EN-Numbers-Years documentation Contained in the Lingua-EN-Numbers-Years distribution.

Index


Code Index:

NAME

Top

Lingua::EN::Numbers::Years - turn "1984" into "nineteen eighty-four", etc

SYNOPSIS

Top

  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!

DESCRIPTION

Top

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.

NOTES

Top

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".

SEE ALSO

Top

Lingua::EN::Numbers

Lingua::EN::WordsToNumbers

COPYRIGHT

Top

AUTHOR

Top

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__