MartinCMS
asked on
Convert Dollars Amount Into Words
Hello EE,
I am being presenting with a simple, yet challenging issue and would like to ask all EE to see if anyone know of a SQL function or if anyone know of a good way handle this.
myTable
Rec Col1 Col2
1 10911.95
2 3181.00
3 506.09
4 40.14
5 0.85
Col1 is money field, run an Update statement for Col2 in myTable
Results after update
Rec Col1 Col2
1 10911.95 Ten Thousand Nine Hundred Eleven and 95/100 Dollars
2 3181.00 Three Thousand One Hundred One and 00/100 Dollars
3 506.09 Five Hundred Six and 09/100 Dollars
4 40.14 Forty and 14/100 Dollars
5 0.85 Zero and 85/100 Dollars
As you can tell, it is very much like the way we all are writing our personal check.
Thank you!
I am being presenting with a simple, yet challenging issue and would like to ask all EE to see if anyone know of a SQL function or if anyone know of a good way handle this.
myTable
Rec Col1 Col2
1 10911.95
2 3181.00
3 506.09
4 40.14
5 0.85
Col1 is money field, run an Update statement for Col2 in myTable
Results after update
Rec Col1 Col2
1 10911.95 Ten Thousand Nine Hundred Eleven and 95/100 Dollars
2 3181.00 Three Thousand One Hundred One and 00/100 Dollars
3 506.09 Five Hundred Six and 09/100 Dollars
4 40.14 Forty and 14/100 Dollars
5 0.85 Zero and 85/100 Dollars
As you can tell, it is very much like the way we all are writing our personal check.
Thank you!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Darn it, I'm too slow!
I just finished a version using two functions (a subfunc handled 1-999 since that is common to all amount levels: billions, millions, thousands, etc.).
I just finished a version using two functions (a subfunc handled 1-999 since that is common to all amount levels: billions, millions, thousands, etc.).
ASKER
@ScottPletcher - I wouldn't mind to learn more than one way to accomplish this task at all. How about 250 points to see your logic?
Works for me.
I, too, have seen this Q posted before and finally had time to work on it :-). As a side benefit, function is customized to what you indicated as your desired output.
Sample invocation:
SELECT dbo.numberToWords(12345678 9123.45)
SELECT dbo.numberToWords(0.00)
-- sub-function (/ "worker" function)
CREATE FUNCTION dbo.Number999ToWords (
@amount INT
)
RETURNS VARCHAR(36)
AS
BEGIN --FUNCTION
IF @amount = 0
RETURN ''
DECLARE @result VARCHAR(36)
SET @result = ''
IF @amount > 99
BEGIN
SET @result = @result + RTRIM(SUBSTRING('One Two ThreeFour Five Six SevenEightNine',
((@amount / 100) - 1) * 5 + 1, 5)) + ' Hundred '
SET @amount = @amount % 100
END --IF
IF @amount BETWEEN 11 AND 19
BEGIN
SET @result = @result + RTRIM(SUBSTRING(
'Eleven Twelve Thirteen Fourteen Fifteen Sixteen SeventeenEighteen Nineteen',
((@amount - 10) - 1) * 9 + 1, 9))
END --IF
ELSE
BEGIN
IF @amount > 9
SET @result = @result + RTRIM(SUBSTRING(
'Ten Twenty Thirty Forty Fifty Sixty SeventyEighty Ninety',
((@amount / 10) - 1) * 7 + 1, 7))
IF @amount % 10 <> 0
BEGIN
IF @amount > 9
SET @result = @result + '-'
SET @result = @result + RTRIM(SUBSTRING('One Two ThreeFour Five Six SevenEightNine',
((@amount % 10) - 1) * 5 + 1, 5))
END --IF
END --ELSE
RETURN RTRIM(@result)
END --FUNCTION
-- main function
CREATE FUNCTION dbo.NumberToWords (
@amount DECIMAL(14, 2)
)
RETURNS VARCHAR(150)
AS
BEGIN --FUNCTION
DECLARE @result VARCHAR(150)
SET @result = ''
IF @amount < 1.00
SET @result = 'Zero'
IF @amount > 999999999
BEGIN
SET @result = @result + dbo.Number999ToWords(@amou nt / 1000000000) + ' Billion '
SET @amount = @amount - (FLOOR(@amount / 1000000000) * 1000000000)
END --IF
IF @amount > 999999
BEGIN
SET @result = @result + dbo.Number999ToWords(@amou nt / 1000000) + ' Million '
SET @amount = @amount - (FLOOR(@amount / 1000000) * 1000000)
END --IF
IF @amount > 999
BEGIN
SET @result = @result + dbo.Number999ToWords(@amou nt / 1000) + ' Thousand '
SET @amount = @amount - (FLOOR(@amount / 1000) * 1000)
END --IF
SET @result = @result + dbo.Number999ToWords(@amou nt) + ' '
SET @amount = @amount - FLOOR(@amount)
SET @result = @result + 'and ' + RIGHT('0' + CAST(CAST(@amount * 100 AS SMALLINT) AS VARCHAR(2)), 2) + '/100 Dollars '
RETURN @result
END --FUNCTION
I, too, have seen this Q posted before and finally had time to work on it :-). As a side benefit, function is customized to what you indicated as your desired output.
Sample invocation:
SELECT dbo.numberToWords(12345678
SELECT dbo.numberToWords(0.00)
-- sub-function (/ "worker" function)
CREATE FUNCTION dbo.Number999ToWords (
@amount INT
)
RETURNS VARCHAR(36)
AS
BEGIN --FUNCTION
IF @amount = 0
RETURN ''
DECLARE @result VARCHAR(36)
SET @result = ''
IF @amount > 99
BEGIN
SET @result = @result + RTRIM(SUBSTRING('One Two ThreeFour Five Six SevenEightNine',
((@amount / 100) - 1) * 5 + 1, 5)) + ' Hundred '
SET @amount = @amount % 100
END --IF
IF @amount BETWEEN 11 AND 19
BEGIN
SET @result = @result + RTRIM(SUBSTRING(
'Eleven Twelve Thirteen Fourteen Fifteen Sixteen SeventeenEighteen Nineteen',
((@amount - 10) - 1) * 9 + 1, 9))
END --IF
ELSE
BEGIN
IF @amount > 9
SET @result = @result + RTRIM(SUBSTRING(
'Ten Twenty Thirty Forty Fifty Sixty SeventyEighty Ninety',
((@amount / 10) - 1) * 7 + 1, 7))
IF @amount % 10 <> 0
BEGIN
IF @amount > 9
SET @result = @result + '-'
SET @result = @result + RTRIM(SUBSTRING('One Two ThreeFour Five Six SevenEightNine',
((@amount % 10) - 1) * 5 + 1, 5))
END --IF
END --ELSE
RETURN RTRIM(@result)
END --FUNCTION
-- main function
CREATE FUNCTION dbo.NumberToWords (
@amount DECIMAL(14, 2)
)
RETURNS VARCHAR(150)
AS
BEGIN --FUNCTION
DECLARE @result VARCHAR(150)
SET @result = ''
IF @amount < 1.00
SET @result = 'Zero'
IF @amount > 999999999
BEGIN
SET @result = @result + dbo.Number999ToWords(@amou
SET @amount = @amount - (FLOOR(@amount / 1000000000) * 1000000000)
END --IF
IF @amount > 999999
BEGIN
SET @result = @result + dbo.Number999ToWords(@amou
SET @amount = @amount - (FLOOR(@amount / 1000000) * 1000000)
END --IF
IF @amount > 999
BEGIN
SET @result = @result + dbo.Number999ToWords(@amou
SET @amount = @amount - (FLOOR(@amount / 1000) * 1000)
END --IF
SET @result = @result + dbo.Number999ToWords(@amou
SET @amount = @amount - FLOOR(@amount)
SET @result = @result + 'and ' + RIGHT('0' + CAST(CAST(@amount * 100 AS SMALLINT) AS VARCHAR(2)), 2) + '/100 Dollars '
RETURN @result
END --FUNCTION
I have to admit I couldn't tell if I got errors from the other function (the linked-to code). Did I feed the value in in the wrong format?
SELECT dbo.no2word('123456789')
Result:
Twelve Crore Thirty Four Lack Fifty Six Thousand Seven Hundred Eighty Nine
??
SELECT dbo.no2word('123456789')
Result:
Twelve Crore Thirty Four Lack Fifty Six Thousand Seven Hundred Eighty Nine
??
ASKER
@ScottPletcher - you're absolutely right!
SELECT dbo.no2word('123456789') function actually returned that result which was why I have to make modification to get it to work. Anyway, your function works wonder! I can feed decimal and get the result as expected.
I'll post points for you shortly. Nice code @ScottPletcher!
SELECT dbo.no2word('123456789') function actually returned that result which was why I have to make modification to get it to work. Anyway, your function works wonder! I can feed decimal and get the result as expected.
I'll post points for you shortly. Nice code @ScottPletcher!
ASKER
I know you said no point, but you're the one leading me to get to the answer is as good as helping me accomplished the solution. So the points are all your, thank you very much @ChrisFretwell.