BEGIN
{
use
vars
qw($VERSION @ENumbers %ENumbers)
;
$VERSION
=
'0.10'
;
require
5.000;
@ENumbers
=(
"፩"
,
"፪"
,
"፫"
,
"፬"
,
"፭"
,
"፮"
,
"፯"
,
"፰"
,
"፱"
,
"፲"
,
"፳"
,
"፴"
,
"፵"
,
"፶"
,
"፷"
,
"፸"
,
"፹"
,
"፺"
,
"፻"
,
"፼"
);
%ENumbers
=(
'፩'
=> 1,
'፪'
=> 2,
'፫'
=> 3,
'፬'
=> 4,
'፭'
=> 5,
'፮'
=> 6,
'፯'
=> 7,
'፰'
=> 8,
'፱'
=> 9,
'፲'
=> 10,
'፳'
=> 20,
'፴'
=> 30,
'፵'
=> 40,
'፶'
=> 50,
'፷'
=> 60,
'፸'
=> 70,
'፹'
=> 80,
'፺'
=> 90,
'፻'
=> 100,
'፼'
=> 10000
);
}
sub
_setArgs
{
my
$self
=
shift
;
if
(
$#_
> 1 ) {
warn
(
"to many arguments"
);
return
;
}
$self
->{number} =
$_
if
( /^\d+$/ );
1;
}
sub
new
{
my
$class
=
shift
;
my
$self
= {};
my
$blessing
=
bless
$self
,
$class
;
$self
->{number} =
undef
;
$self
->_setArgs (
@_
) ||
return
if
(
@_
);
$blessing
;
}
sub
_fromEthiopic
{
return
(
$ENumbers
{
$_
[0]->{number}} )
if
(
length
(
$_
[0]->{number}) == 1);
$_
=
$_
[0]->{number};
s/^([፻፼])/፩$1/;
s/፼፻/፼፩፻/g;
s/([፻፼])([፩-፱])/$1.
"0$2"
/ge;
s/([፲-፺])([^፩-፱])/$1.
"0$2"
/ge;
s/([፲-፺])$/$1.
"0"
/e;
s/፻$/፻00/;
s/፼$/፼0000/;
s/፼፼/፼0000፼/g;
s/፻፼/፼00፼/g;
s/፼0([፩-፱])፼/፼000$1፼/g;
s/፼0([፩-፱])$/፼000$1/;
s/፼([፲-፺]0)፼/፼00$1፼/g;
s/፼([፲-፺]0)$/፼00$1/;
s/፼([፩-፺]{2})፼/፼00$1፼/g;
s/፼([፩-፺]{2})$/፼00$1/;
s/(፻)$/$1.
"00"
/e;
s/[፻፼]//g;
tr
/[፲-፺]/[፩-፱]/;
tr
/[፩-፱]/[1-9]/;
$_
;
}
sub
_toEthiopic
{
my
$number
=
$_
[0]->{number};
my
@aNumberString
=
split
( //,
$number
);
my
$eNumberString
=
""
;
my
$n
=
length
(
$number
) - 1;
for
(
my
$place
=
$n
;
$place
>= 0 ;
$place
-- ) {
my
$pos
=
$place
% 4;
my
$aTen
=
$aOne
=
$eTen
=
$eOne
=
''
;
if
(
$place
% 2 ) {
$aTen
=
$aNumberString
[
$n
-
$place
];
$place
--;
$eTen
=
$ENumbers
[
$aTen
-1+9]
if
(
$aTen
);
$aOne
=
$aNumberString
[
$n
-
$place
]
if
(
$place
>= 0 );
$eOne
=
$ENumbers
[
$aOne
-1]
if
(
$aOne
);
$pos
--;
}
else
{
$aOne
=
$aNumberString
[
$n
-
$place
];
$eOne
=
$ENumbers
[
$aOne
-1]
if
(
$aOne
);
}
my
$sep
= (
$place
)
? (
$pos
)
? (
$pos
==2 && (
$aTen
||
$aOne
) )
?
'፻'
:
''
:
'፼'
:
''
;
if
( (
$place
==
$n
)
&& (
$n
> 0 )
&& (
$aOne
== 1 ) )
{
$eOne
=
''
; }
if
( (
$aOne
&&
$aOne
== 1 &&
$place
> 0 )
&& (
$aTen
&&
$aTen
== 0 )
&& (
$sep
eq
'፻'
) )
{
$eOne
=
''
; }
$eNumberString
.=
"$eTen$eOne$sep"
;
}
$eNumberString
;
}
sub
convert
{
my
$self
=
shift
;
$self
->number (
@_
)
if
(
@_
);
(
$self
->number =~ /^[0-9]+$/ )
?
$self
->_toEthiopic
:
$self
->_fromEthiopic
;
}
sub
number
{
my
$self
=
shift
;
$self
->{number} =
$_
[0]
if
(
@_
);
$self
->{number};
}
1;