Convert Number to Word in Sql Server
Prerequisite – SQL introduction
In SQL code groups of commands are arranged within a block. A block group related declarations or statements. In declare part, we declare variables and between begin and end part, we perform the operations.
In SQL code groups of commands are arranged within a block. A block group related declarations or statements. In declare part, we declare variables and between begin and end part, we perform the operations.
Given a number and the task is to convert each digit of the number into words.
Approach is to select the corresponding word of a particular number using FnNumtoWords function.
Below is the required implementation:
Function 1
IF OBJECT_ID('FnConvertDigit') IS NOT NULLDROP FUNCTION FnConvertDigit
GO
CREATE Function [dbo].[FnConvertDigit](@decNumber decimal)
RETURNS VARCHAR(6)
AS
BEGIN
DECLARE
@strWords VARCHAR(6)
SELECT @strWords = CASE @decNumber
WHEN '1' THEN 'One'
WHEN '2' THEN 'Two'
WHEN '3' THEN 'Three'
WHEN '4' THEN 'Four'
WHEN '5' THEN 'Five'
WHEN '6' THEN 'Six'
WHEN '7' THEN 'Seven'
WHEN '8' THEN 'Eight'
WHEN '9' THEN 'Nine'
ELSE ''
END
RETURN @strWords
END
Function 2 :
IF OBJECT_ID('FnConvertDigit') IS NOT NULL
DROP FUNCTION FnConvertDigit
GO
CREATE FUNCTION [dbo].[FnConvertTens](@decNumber varchar(2))
RETURNS VARCHAR(30)
AS
BEGIN
declare @strWords varchar(30)
--Is value between 10 and 19?
If Left(@decNumber, 1) = 1
BEGIN
SELECT @strWords = Case @decNumber
WHEN '10' THEN 'Ten'
WHEN '11' THEN 'Eleven'
WHEN '12' THEN 'Twelve'
WHEN '13' THEN 'Thirteen'
WHEN '14' THEN 'Fourteen'
WHEN '15' THEN 'Fifteen'
WHEN '16' THEN 'Sixteen'
WHEN '17' THEN 'Seventeen'
WHEN '18' THEN 'Eighteen'
WHEN '19' THEN 'Nineteen'
END
END
ELSE -- otherwise it's between 20 and 99.
BEGIN
SELECT @strWords = Case Left(@decNumber, 1)
WHEN '0' THEN ''
WHEN '2' THEN 'Twenty '
WHEN '3' THEN 'Thirty '
WHEN '4' THEN 'Forty '
WHEN '5' THEN 'Fifty '
WHEN '6' THEN 'Sixty '
WHEN '7' THEN 'Seventy '
WHEN '8' THEN 'Eighty '
WHEN '9' THEN 'Ninety '
END
SELECT @strWords = @strWords + dbo.FnConvertDigit(Right(@decNumber, 1))
END
--Convert ones place digit.
RETURN @strWords
END
GO
Function 3
IF OBJECT_ID('FnNumToWords') IS NOT NULL
DROP FUNCTION FnNumToWords
GO
/*===================================================================================
CREATED BY: SA
Description: Converts Amount in Figures to Words
DATE : 07/17/2020
USAGE :SELECT dbo.FnNumToWords(999999.99,'1')
=====================================================================================*/
ALTER FUNCTION [dbo].[FnNumToWords] (@decNumber DECIMAL(12, 2),@Currency CHAR(1))
RETURNS VARCHAR(300)
AS
BEGIN
DECLARE
@strNumber VARCHAR(100),
@strCedis VARCHAR(200),
@strPesewas VARCHAR(100),
@strWords VARCHAR(300),
@Index INT,
@Flag INT,
@VCurrency CHAR(1)
IF ISNULL(@Currency,'') = ''
BEGIN
SET @VCurrency = '1'
END
ELSE
BEGIN
SET @VCurrency = @Currency
END
SELECT @strNumber = CAST(@decNumber AS VARCHAR(100))
SELECT @Index = CHARINDEX('.', @strNumber)
IF(@decNumber>999999.99 OR ISNULL(@decNumber,0) = 0)
BEGIN
RETURN ''
END
IF @Index > 0
BEGIN
SELECT @strPesewas = dbo.FnConvertTens(Right(@strNumber, LEN(@strNumber) - @Index))
SELECT @strNumber = SUBSTRING(@strNumber, 1, LEN(@strNumber) - LEN(SUBSTRING(@strNumber,CHARINDEX('.', @strNumber),LEN(@strNumber))))
IF LEN(@strPesewas) > 0
SELECT @strPesewas = @strPesewas + CASE @VCurrency WHEN '1' THEN ' pesewa(s)'
WHEN '2' THEN ' Cent(s)'
WHEN '3' THEN ' pence'
WHEN '4' THEN ' Cent(s)'
END
END
SELECT @strCedis = ''
SELECT @Index=LEN(@strNumber)
SELECT @Flag=2
WHILE (@Index > 0)
BEGIN
IF (@Index=6)
BEGIN
IF(SUBSTRING(@strNumber,2,1)<>'0' OR SUBSTRING(@strNumber,3,1)<>'0' AND SUBSTRING(@strNumber,4,1)='0' AND SUBSTRING(@strNumber,5,1)='0' AND
SUBSTRING(@strNumber,6,1)='0' AND @Flag=2 and @strPesewas='')
BEGIN
IF LEN(@strCedis) <= 0
BEGIN
IF CONVERT(INT,SUBSTRING(@strNumber,1,1)) = 1
BEGIN
SELECT @strCedis=@strCedis+'' + dbo.fConvertDigit(SUBSTRING(@strNumber,1,1))+' Hundred '
SELECT @Flag=2
END
ELSE
BEGIN
SELECT @strCedis=@strCedis+'' + dbo.fConvertDigit(SUBSTRING(@strNumber,1,1))+' Hundred '
SELECT @Flag=2
END
END
ELSE
BEGIN
IF CONVERT(INT,SUBSTRING(@strNumber,1,1)) = 1
BEGIN
SELECT @strCedis=@strCedis+' and' + dbo.fConvertDigit(SUBSTRING(@strNumber,1,1))+' Hundred '
SELECT @Flag=1
END
ELSE
BEGIN
SELECT @strCedis=@strCedis+' and' + dbo.fConvertDigit(SUBSTRING(@strNumber,1,1))+' Hundred '
SELECT @Flag=1
END
END
END
ELSE
BEGIN
IF CONVERT(INT,SUBSTRING(@strNumber,1,1)) = 1
BEGIN
SELECT @strCedis=@strCedis+dbo.fConvertDigit(SUBSTRING(@strNumber,1,1))+' Hundred '
END
ELSE
BEGIN
SELECT @strCedis=@strCedis+dbo.fConvertDigit(SUBSTRING(@strNumber,1,1))+' Hundred '
END
END
SELECT @strNumber=SUBSTRING(@strNumber,2,LEN(@strNumber))
SELECT @Index=@Index-1
END
ELSE IF (@Index=5)
BEGIN
IF(SUBSTRING(@strNumber,1,1)='0')
BEGIN
IF SUBSTRING(@strNumber,2,1)<>'0'
BEGIN
IF(SUBSTRING(@strNumber,3,1)='0' AND SUBSTRING(@strNumber,4,1)='0' AND SUBSTRING(@strNumber,5,1)='0' AND @Flag=2 AND @strPesewas='')
BEGIN
SELECT @strCedis=@strCedis+' and ' +dbo.FnConvertDigit(SUBSTRING(@strNumber,2,1))+' Thousand '
SELECT @Flag=1
END
ELSE
BEGIN
SELECT @strCedis=@strCedis+dbo.FnConvertDigit(SUBSTRING(@strNumber,2,1))+' Thousand '
END
SELECT @strNumber=SUBSTRING(@strNumber,3,LEN(@strNumber))
SELECT @Index=@Index-2
END
ELSE IF SUBSTRING(@strNumber,2,1)='0'
BEGIN
SELECT @strCedis=@strCedis+dbo.FnConvertDigit(SUBSTRING(@strNumber,2,1))+' Thousand '
SELECT @strNumber=SUBSTRING(@strNumber,3,LEN(@strNumber))
SELECT @Index=@Index-2
END
ELSE
BEGIN
SELECT @strNumber=SUBSTRING(@strNumber,3,LEN(@strNumber))
SELECT @Index=@Index-2
END
END
ELSE
BEGIN
IF(SUBSTRING(@strNumber,3,1)='0' AND SUBSTRING(@strNumber,4,1)='0' AND SUBSTRING(@strNumber,5,1)='0' AND @Flag=2 AND @strPesewas='')
BEGIN
SELECT @strCedis=@strCedis+dbo.FnConvertTens(SUBSTRING(@strNumber,1,2))+' Thousand '
SELECT @Flag=1
END
ELSE
BEGIN
SELECT @strCedis=@strCedis+dbo.FnConvertTens(SUBSTRING(@strNumber,1,2))+' Thousand '
END
SELECT @strNumber=SUBSTRING(@strNumber,3,LEN(@strNumber))
SELECT @Index=@Index-2
END
END
ELSE IF (@Index=4)
BEGIN
IF ( (SUBSTRING(@strNumber,3,1)<>'0' AND SUBSTRING(@strNumber,4,1)<>'0') AND SUBSTRING(@strNumber,2,1)='0' AND @Flag=2 AND @strPesewas='')
BEGIN
SELECT @strCedis=@strCedis+' and' + dbo.FnConvertDigit(SUBSTRING(@strNumber,1,1))+' Thousand '
SELECT @Flag=1
END
ELSE
BEGIN
SELECT @strCedis=@strCedis+dbo.FnConvertDigit(SUBSTRING(@strNumber,1,1))+' Thousand '
END
SELECT @strNumber=SUBSTRING(@strNumber,2,LEN(@strNumber))
SELECT @Index=@Index-1
END
ELSE IF (@Index=3)
BEGIN
IF SUBSTRING(@strNumber,1,1)<>'0'
BEGIN
SELECT @strCedis=@strCedis+dbo.FnConvertDigit(SUBSTRING(@strNumber,1,1))+' Hundred '
SELECT @strNumber=SUBSTRING(@strNumber,2,LEN(@strNumber))
IF( (SUBSTRING(@strNumber,1,1)<>'0' OR SUBSTRING(@strNumber,2,1)<>'0') AND @Flag=2 )
BEGIN
SELECT @strCedis=@strCedis+' and '
SELECT @Flag=1
END
SELECT @Index=@Index-1
END
ELSE
BEGIN
SELECT @strNumber=SUBSTRING(@strNumber,2,LEN(@strNumber))
SELECT @Index=@Index-1
END
END
ELSE IF (@Index=2)
BEGIN
IF SUBSTRING(@strNumber,1,1)<>'0'
BEGIN
SELECT @strCedis=@strCedis+dbo.FnConvertTens(SUBSTRING(@strNumber,1,2))
SELECT @Index=@Index-2
END
ELSE
BEGIN
SELECT @Index=@Index-1
END
END
ELSE IF (@Index=1)
BEGIN
IF (@strNumber<>'0')
BEGIN
SELECT @strCedis=@strCedis+dbo.FnConvertDigit(@strNumber)
END
SELECT @Index=@Index-1
END
CONTINUE
END
IF LEN(@strCedis)>0 SELECT @strCedis=@strCedis+ CASE @VCurrency WHEN '1' THEN ' Cedi(s) '
WHEN '2' THEN ' Dollar(s) '
WHEN '3' THEN ' Pound(s) '
WHEN '4' THEN ' Euro(s) '
END
IF(LEN(@strPesewas)<>0)
BEGIN
IF LEN(@strCedis)>0 SELECT @strCedis=@strCedis + ' and '
END
SELECT @strWords = ISNULL(@strCedis, '') + ISNULL(@strPesewas, '')
SELECT @strWords = @strWords + ' only'
RETURN @strWords
END
GO
Comments