ordinate(3)
NAME
Lingua::EN::Numbers::Ordinate -- go from cardinal number
(3) to ordinal ("3rd")
SYNOPSIS
use Lingua::EN::Numbers::Ordinate;
print ordinate(4), "0;
# prints 4th
print ordinate(-342), "0;
# prints -342nd
# Example of actual use:
...
for(my $i = 0; $i < @records; $i++) {
unless(is_valid($record[$i]) {
warn "The ", ordinate($i), " record is invalid!0;
next;
}
...
}
DESCRIPTION
There are two kinds of numbers in English -- cardinals (1,
2, 3...), and ordinals (1st, 2nd, 3rd...). This library
provides functions for giving the ordinal form of a num
ber, given its cardinal value.
FUNCTIONS
- ordinate(SCALAR)
- Returns a string consisting of that scalar's string
form, plus the appropriate ordinal suffix. Example:
"ordinate(23)" returns "23rd". - As a special case, "ordinate(undef)" and "ordi
nate("")" return "0th", not "th". - This function is exported by default.
- th(SCALAR)
- Merely an alias for "ordinate", but not exported by
default. - ordsuf(SCALAR)
- Returns just the appropriate ordinal suffix for the
given scalar numeric value. This is what "ordinate"
uses to actually do its work. For example, ordsuf(3)
is "rd". - Not exported by default.
- The above functions are all prototyped to take a scalar
value, so "ordinate(@stuff)" is the same as "ordi
nate(scalar @stuff)".
CAVEATS
* Note that this library knows only about numbers, not
number-words. "ordinate('seven')" might just as well be
"ordinate('superglue')" or "ordinate("EA")" -you'll get the fallthru case of the input string plus
"th".
* As is unavoidable, "ordinate(0256)" returns "174th"
(because ordinate sees the value 174). Similarly, "ordi
nate(1E12)" returns "1000000000000th". Returning "tril
lionth" would be nice, but that's an awfully atypical
case.
* Note that this library's algorithm (as well as the basic
concept and implementation of ordinal numbers) is totally
language specific.
To pick a trivial example, consider that in French, 1
ordinates as "1ier", whereas 41 ordinates as "41ieme".
STILL NOT SATISFIED?
- Bored of this...?
- use Lingua::EN::Numbers::Ordinate qw(ordinate th);
...
print th($n), " entry processed...0;
... - Try this bit of lunacy:
{my $th_object;
sub _th () { $th_object }package Lingua::EN::Numbers::Ordinate::Overloader;
my $x; # Gotta have something to bless.
$th_object = bless ; # Define the object now, which_th returns
use Carp ();
use Lingua::EN::Numbers::Ordinate ();
sub overordinate {Carp::croak "_th should be used only as postfix!"unless $_[2];
Lingua::EN::Numbers::Ordinate::ordinate($_[1]);}
use overload '&' => overordinate;- }
- Then you get to do:
print 3 & _th, "0;# prints "3rd"- print 1 + 2 & _th, "0;
# prints "3rd" too!
# Because of the precedence of & ! - print _th & 3, "0;
# dies with: "th should be used only as postfix!"
- Kooky, isn't it? For more delightful deleria like this,
see Damian Conway's Object Oriented Perl from Manning Press. - Kinda makes you like th(3), doesn't it?
COPYRIGHT
Copyright (c) 2000 Sean M. Burke. All rights reserved.
This library is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
AUTHOR
- Sean M. Burke "sburke@cpan.org"