It's been a while since I posted or helped out some folks here, but I am back with a question.
I have a website I am working on that has to display a currency value as stored in the database as a text string. It has to optionally display cents if available, and deal with values into the 100s of millions of dollars.
I know I could do this in ASP or other middle-ware, but I was hoping to write a user-defined function that given a float returns the string representation as described, for example:
Input:
128134.50
Output:
One Hundred Twenty Eight Thousand, One Hundred Thirty Four and 50/100.
Here is what I have for a UDF, and it seems to work, I am just wondering if I got all the various cases worked out, and if their might be some easier or better way to do this?
Sorry for the formatting of the code; please cut and paste into Query Analyzer to create the UDF and to view the code better; thanks!
Thanks,
TJR
I have a website I am working on that has to display a currency value as stored in the database as a text string. It has to optionally display cents if available, and deal with values into the 100s of millions of dollars.
I know I could do this in ASP or other middle-ware, but I was hoping to write a user-defined function that given a float returns the string representation as described, for example:
Input:
128134.50
Output:
One Hundred Twenty Eight Thousand, One Hundred Thirty Four and 50/100.
Here is what I have for a UDF, and it seems to work, I am just wondering if I got all the various cases worked out, and if their might be some easier or better way to do this?
Sorry for the formatting of the code; please cut and paste into Query Analyzer to create the UDF and to view the code better; thanks!
Code:
-- Returns a text string that describes an amount
CREATE FUNCTION GetAmountString( @amount float )
RETURNS varchar(100)
AS
BEGIN
declare @orig_amt float
declare @factor float
declare @str_amount varchar(100)
declare @mod int
set @orig_amt = @amount
set @factor = 1000000 -- Supports up to 999,999,999.99 (1 penny shy of 1 billion)
set @str_amount = ''
-- Loop through working on Millions, Thousands, Hundreds and Pennies.
while @amount > 0.00
begin
-- If Pennies
if @amount > 0.0 and @amount < 1.0
begin
if @str_amount<>'' set @str_amount = @str_amount + ' and '
set @str_amount = @str_amount + convert(varchar, convert(int, @amount*100)) + '/100'
set @amount = 0.00
end
else
begin
-- Get modulus amount
set @mod = convert(int, @amount) / @factor
-- If Twenty or less
if @mod <= 20
begin
select @str_amount = @str_amount + ' ' + NumberString from NumberString where NumberValue = @mod
end
-- If greater than twenty but less than hundred (parse 10s, 1s)
if @mod > 20 and @mod <=99
begin
select @str_amount = @str_amount + ' ' + NumberString from NumberString where NumberValue = (@mod / 10)*10
select @str_amount = @str_amount + ' ' + NumberString from NumberString where NumberValue = @mod % 10
end
-- If greater than one hundres (parse 100s, 10s, 1s)
if @mod > 99 begin
select @str_amount = @str_amount + ' ' + NumberString + ' Hundred' from NumberString where NumberValue = @mod / 100
-- Tens and Ones could be less twenty or less, then parse as teens or single digit
if @mod % 100 <= 20
begin
select @str_amount = @str_amount + ' ' + NumberString from NumberString where NumberValue = @mod%100
end
else
-- else parse and tens and single digit
begin
select @str_amount = @str_amount + ' ' + NumberString from NumberString where NumberValue = (@mod%100 / 10)*10
select @str_amount = @str_amount + ' ' + NumberString from NumberString where NumberValue = @mod % 10
end
end
-- Add in Million or Thousand keyword
if @factor > 1 and @str_amount<> ''
begin
select @str_amount = @str_amount + ' ' + NumberString from NumberString where NumberValue = @factor
end
select @amount = @amount - @factor * @mod
-- Add in comma if additional monies follow and Million or Thousand preceeded
if @str_amount<> '' and @amount>=1.0 and @factor>1 select @str_amount = @str_amount + ','
set @factor = @factor / 1000
end
end
if @str_amount='' set @str_amount='Zero'
set @str_amount = replace(ltrim(@str_amount), ' ', ' ')
return(@str_amount)
END
Thanks,
TJR