Advertisements
Home > Business Intelligence, SQL Server, SSRS > Convert Number Value Into Words using SSRS

Convert Number Value Into Words using SSRS

For Display Amount Value into Words with SQL Reporting Services 2008, we can implement the same with following two ways.

· Database Function

· Custom Assembly

Here is small try to explain how we can archive this with Database Function.

First need to write function that will take one parameter as number & will return string.

CREATE FUNCTION dbo.udf_Num_ToWords
(
@Number Numeric (38, 0) -- Input number with as many as 18 digits
) RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @inputNumber VARCHAR(38),
@outputString VARCHAR(8000),
@length INT ,
@counter INT,
@loops INT,
@position INT,
@chunk CHAR(3), -- for chunks of 3 numbers
@tensones CHAR(2),
@hundreds CHAR(1),
@tens CHAR(1),
@ones CHAR(1)
DECLARE @NumbersTable TABLE (number CHAR(2), word VARCHAR(10))

IF @Number = 0 Return 'Zero'

-- initialize the variables
SELECT
@inputNumber = CONVERT(varchar(38), @Number)
, @outputString = ''
, @counter = 1
SELECT
@length = LEN(@inputNumber)
, @position = LEN(@inputNumber) - 2
, @loops = LEN(@inputNumber)/3

-- make sure there is an extra loop added for the remaining numbers
IF LEN(@inputNumber) % 3 <> 0 SET @loops = @loops + 1

-- insert data for the numbers and words
INSERT INTO @NumbersTable SELECT '00', ''
UNION ALL SELECT '01', 'one' UNION ALL SELECT '02', 'two'
UNION ALL SELECT '03', 'three' UNION ALL SELECT '04', 'four'
UNION ALL SELECT '05', 'five' UNION ALL SELECT '06', 'six'
UNION ALL SELECT '07', 'seven' UNION ALL SELECT '08', 'eight'
UNION ALL SELECT '09', 'nine' UNION ALL SELECT '10', 'ten'
UNION ALL SELECT '11', 'eleven' UNION ALL SELECT '12', 'twelve'
UNION ALL SELECT '13', 'thirteen' UNION ALL SELECT '14', 'fourteen'
UNION ALL SELECT '15', 'fifteen' UNION ALL SELECT '16', 'sixteen'
UNION ALL SELECT '17', 'seventeen' UNION ALL SELECT '18', 'eighteen'
UNION ALL SELECT '19', 'nineteen' UNION ALL SELECT '20', 'twenty'
UNION ALL SELECT '30', 'thirty' UNION ALL SELECT '40', 'forty'
UNION ALL SELECT '50', 'fifty' UNION ALL SELECT '60', 'sixty'
UNION ALL SELECT '70', 'seventy' UNION ALL SELECT '80', 'eighty'
UNION ALL SELECT '90', 'ninety'

WHILE @counter <= @loops
BEGIN
-- get chunks of 3 numbers at a time, padded with leading zeros
SET @chunk = RIGHT('000' + SUBSTRING(@inputNumber, @position, 3), 3)
IF @chunk <> '000'
BEGIN
SELECT
@tensones = SUBSTRING(@chunk, 2, 2)
, @hundreds = SUBSTRING(@chunk, 1, 1)
, @tens = SUBSTRING(@chunk, 2, 1)
, @ones = SUBSTRING(@chunk, 3, 1)

-- If twenty or less, use the word directly from @NumbersTable
IF CONVERT(INT, @tensones) <= 20 OR @Ones='0'
BEGIN
SET
@outputString = (SELECT word FROM @NumbersTable WHERE @tensones = number)+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN ' thousand ' WHEN 3 THEN ' million '
WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion '
WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion '
WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion '
WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion '
WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion '
ELSE '' END + @outputString
END
ELSE BEGIN -- break down the ones and the tens separately
SET @outputString = ' ' + (SELECT word FROM @NumbersTable WHERE @tens + '0' = number)
+ '-' + (SELECT word
FROM
@NumbersTable
WHERE
'0'+ @ones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN ' thousand ' WHEN 3 THEN ' million '
WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion '
WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion '
WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion '
WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion '
WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion '
ELSE '' END + @outputString
END

-- now get the hundreds
IF @hundreds <> '0'
BEGIN
SET
@outputString = (SELECT word FROM @NumbersTable
WHERE
'0' + @hundreds = number)+ ' hundred ' + @outputString
END
END

SELECT
@counter = @counter + 1
, @position = @position - 3

END

-- Remove any double spaces
SET @outputString = LTRIM(RTRIM(REPLACE(@outputString, ' ', ' ')))
SET @outputstring = UPPER(LEFT(@outputstring, 1)) + SUBSTRING(@outputstring, 2, 8000)

RETURN @outputString -- return the result
END
GO

GRANT EXEC on dbo.udf_Num_ToWords TO PUBLIC
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Then just call this function in your dataset query along with your requirements

SELECT dbo.udf_Num_ToWords (345)

This is the result: Three hundred  forty-five

Hope this will help someone…

Thanks

Sandip Shinde

Advertisements
  1. cvijiyan@yahoo.com
    November 12, 2016 at 2:39 am

    It’s not working for decimals. SELECT dbo.udf_Num_ToWords (345.50)

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: