Here is a simple pair of functions that will do the trick. This is in
Oracle's PL/SQL but should be readily readable by most programmers. The
VARCHAR2 data type is simply a string. The || operator is the
concatenation operator, and text strings are enclosed in '.
The first function, Get_NumberText, is used to retrieve a text string
equivalent of the base numbers from a database table. An array could do
the same thing. The second function, NumberToText, is recursive to
build the final text string from the given number. This could be more
eligant with a bit more programming, however, this was quick and easy
though limited in scope.
FUNCTION Get_NumberText(Value NUMBER) RETURN VARCHAR2 IS
CURSOR cL(ThisNumber NUMBER) IS
SELECT Text
FROM NumberTranslation
WHERE Value = ThisNumber;
text VARCHAR2(100);
BEGIN
OPEN cL(Value);
FETCH cL INTO Text;
CLOSE cL;
RETURN text;
END;
FUNCTION NumberToText(Value NUMBER) RETURN VARCHAR2 IS
tNum INTEGER;
tRem INTEGER;
tVal INTEGER;
hund INTEGER:=100;
thou INTEGER:=1000;
mill INTEGER:=1000000;
bill INTEGER:=1000000000;
trill INTEGER:=1000000000000;
text VARCHAR2(200);
BEGIN
IF (Value < 0) THEN -- Handles negative values
text := 'MINUS '||NumberToText(ABS(Value));
ELSE
tNum := Value;
IF (tNum = 0) THEN
text := Get_NumberText(tNum);
ELSE
text := ''; -- Instantiate an empty string
tVal := FLOOR(tNum/trill);
tRem := MOD(tNum,trill);
IF (tVal > 0) THEN
text := NumberToText(tVal)||' '||Get_NumberText(trill);
IF (tRem > 0) THEN
text := text||' '||NumberToText(tRem);
END IF;
ELSE
tVal := FLOOR(tNum/bill);
tRem := MOD(tNum,bill);
IF (tVal > 0) THEN
text := NumberToText(tVal)||' '||Get_NumberText(bill);
IF (tRem > 0) THEN
text := text||' '||NumberToText(tRem);
END IF;
ELSE
tVal := FLOOR(tNum/mill);
tRem := MOD(tNum,mill);
IF (tVal > 0) THEN
text := NumberToText(tVal)||' '||Get_NumberText(mill);
IF (tRem > 0) THEN
text := text||' '||NumberToText(tRem);
END IF;
ELSE
tVal := FLOOR(tNum/thou);
tRem := MOD(tNum,thou);
IF (tVal > 0) THEN
text := NumberToText(tVal)||' '||Get_NumberText(thou);
IF (tRem > 0) THEN
text := text||' '||NumberToText(tRem);
END IF;
ELSE
tVal := FLOOR(tNum/hund);
tRem := MOD(tNum,hund);
IF (tVal > 0) THEN
text := NumberToText(tVal)||' '||Get_NumberText(hund);
IF (tRem > 0) THEN
text := text||' '||NumberToText(tRem);
END IF;
ELSE
IF (tNum > 19) THEN
tVal := FLOOR(tNum/10)*10;
tRem := MOD(tNum,10);
text := Get_NumberText(tVal);
IF (tRem > 0) THEN
text := text||'-'||NumberToText(tRem);
END IF;
ELSE
text := Get_NumberText(tNum);
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
RETURN text;
END;
These are the values I have in my table. It can be extended to any
upper limit you choose.
VALUE TEXT
---------- ------------------------------
0 ZERO
1 ONE
2 TWO
3 THREE
4 FOUR
5 FIVE
6 SIX
7 SEVEN
8 EIGHT
9 NINE
10 TEN
11 ELEVEN
12 TWELVE
13 THIRTEEN
14 FOURTEEN
15 FIFTEEN
16 SIXTEEN
17 SEVENTEEN
18 EIGHTTEEN
19 NINETEEN
20 TWENTY
30 THIRTY
40 FORTY
50 FIFTY
60 SIXTY
70 SEVENTY
80 EIGHTY
90 NINETY
100 HUNDRED
1000 THOUSAND
1000000 MILLION
1000000000 BILLION
1.0000E+12 TRILLION
Enjoy.
/*
PLUG: http://plug.org, #utah on irc.freenode.net
Unsubscribe: http://plug.org/mailman/options/plug
Don't fear the penguin.
*/