Re: Number Conversion Function - Mailing list pgsql-general
| From | justin |
|---|---|
| Subject | Re: Number Conversion Function |
| Date | |
| Msg-id | 49DB579D.9070505@emproshunts.com Whole thread Raw |
| In response to | Re: Number Conversion Function (Tom Lane <tgl@sss.pgh.pa.us>) |
| Responses |
Re: Number Conversion Function
|
| List | pgsql-general |
Tom Lane wrote:
Tino Wildenhain <tino@living-examples.com> writes:
I would not recommend to do this within the database. Thats typical
a job for your presentation layer.
... but having said that, I think the "money" datatype has a function
for this. Whether that's of any use to you I dunno; money is pretty
restrictive about what it can handle.
regards, tom lane
I disagree the database is the wrong place, there are cases it makes
sense.
I have looked for what Tom talks about for the money type i can't find
any thing?? so I wrote a function primary purpose is used with checks
but with a little modification will work for anyone one and has no
practical limitation . It will work to Quintillion.
CREATE OR REPLACE FUNCTION spellNumericValue( pValue numeric)
RETURNS text AS
$BODY$
DECLARE
_dollar bigint = trunc(pValue)::text;
_cents int = ((pValue - trunc(pValue))*100)::int;
_spelledAmount text = '' ;
_brokenOut int[] ;
_pos integer = 0;
_word text ;
BEGIN
--lets breakout the number into hundreds into a array
WHILE _dollar > 0 loop
_brokenOut = array_append(_brokenOut, (_dollar%1000)::int);
_dollar = trunc(_dollar/1000);
_pos = _pos + 1;
End Loop;
--this works on numbers between 1 to 999 transforming into english
words. then goes to the
--next set of numbers in the array working backwards as the array
was loaded backwards
--Meaning the highest value is in the last element of the array
_brokenOut
--This also assumes words thousands millions, billions... occurs
every 10^3 .
while _pos > 0 loop
if _brokenOut[_pos] >99 then
SELECT CASE
WHEN _brokenOut[_pos]
>899 THEN 'Nine Hundred '
WHEN _brokenOut[_pos]
>799 THEN 'Eight Hundred '
WHEN _brokenOut[_pos]
>699 THEN 'Seven Hundred '
WHEN _brokenOut[_pos]
>599 THEN 'Six Hundred '
WHEN _brokenOut[_pos]
>499 THEN 'Five Hundred '
WHEN _brokenOut[_pos]
>399 THEN 'Four Hundred '
WHEN _brokenOut[_pos]
>299 THEN 'Three Hundred '
WHEN _brokenOut[_pos]
>199 THEN 'Two Hundred '
WHEN _brokenOut[_pos]
>99 THEN 'One Hundred '
else ''
end
into _word;
_spelledAmount = _spelledAmount || _word ;
end if;
Select Case
WHEN _brokenOut[_pos]%100 = 10 THEN 'Ten '
WHEN _brokenOut[_pos]%100 = 11 THEN 'Eleve
'
WHEN _brokenOut[_pos]%100 = 12 THEN 'Twelve
'
WHEN _brokenOut[_pos]%100 = 13 THEN
'Thirteen'
WHEN _brokenOut[_pos]%100 = 14 THEN
'Fourteen'
WHEN _brokenOut[_pos]%100 = 15 THEN
'Fifteen'
WHEN _brokenOut[_pos]%100 = 16 THEN
'Sixteen'
WHEN _brokenOut[_pos]%100 = 17 THEN
'Seventeen'
WHEN _brokenOut[_pos]%100 = 18 THEN
'Eighteen'
WHEN _brokenOut[_pos]%100 = 19 THEN
'Nineteen'
WHEN _brokenOut[_pos]/10%10=2 THEN 'Twenty
'
WHEN _brokenOut[_pos]/10%10=3 THEN 'Thirty
'
WHEN _brokenOut[_pos]/10%10=4 THEN 'Fourty
'
WHEN _brokenOut[_pos]/10%10=5 THEN 'Fifty '
WHEN _brokenOut[_pos]/10%10=6 THEN 'Sixty '
WHEN _brokenOut[_pos]/10%10=7 THEN 'Seventy
'
WHEN _brokenOut[_pos]/10%10=8 THEN 'Eighty
'
WHEN _brokenOut[_pos]/10%10=9 THEN
'Ninety '
ELSE ''
End
into _word;
_spelledAmount = _spelledAmount || _word;
if _brokenOut[_pos]%100 < 10 or _brokenOut[_pos]%100 > 20
then
SELECT CASE
WHEN _brokenOut[_pos]%10
=1 THEN 'One '
WHEN _brokenOut[_pos]%10
=2 THEN 'Two'
WHEN _brokenOut[_pos]%10
=3 THEN 'Three '
WHEN _brokenOut[_pos]%10
=4 THEN 'Four '
WHEN _brokenOut[_pos]%10
=5 THEN 'Five '
WHEN _brokenOut[_pos]%10
=6 THEN 'Six '
WHEN _brokenOut[_pos]%10
=7 THEN 'Seven '
WHEN _brokenOut[_pos]%10
=8 THEN 'Eight '
WHEN _brokenOut[_pos]%10
=9 THEN 'Nine '
ELSE ''
end
into _word;
_spelledAmount = _spelledAmount || _word;
end if ;
If _pos = 2 then
_spelledAmount = _spelledAmount || 'Thousand ';
elsif _pos = 3 then
_spelledAmount = _spelledAmount || 'Million';
elsif _pos = 4 then
_spelledAmount = _spelledAmount || 'Billion ';
elsif _pos = 5 then
_spelledAmount = _spelledAmount || 'Trillion ';
elsif _pos = 6 then
_spelledAmount = _spelledAmount || 'Quadrillion ';
elsif _pos = 7 then
_spelledAmount = _spelledAmount || 'Quintillion ';
else
_spelledAmount = _spelledAmount || '';
end if;
_pos = _pos-1;
end loop;
if _cents = 0 then
_spelledAmount = _spelledAmount || ' and Zero cents';
else
_spelledAmount = _spelledAmount || 'and ' || _cents::text ||
'/100 cents';
end if ;
return _SpelledAmount;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
pgsql-general by date: