SQL UDF - Inches to Fraction
a. Function convert inches to fraction denomination (11.01 -> 0 ft. 11-1/100 in.)
step 1:
function that converts decimals to fraction form (.01 -> 1/100, 0.25 -> 1/4)
CREATE FUNCTION [dbo].[udf_ConvertToFraction] (@NumToConvert DECIMAL(25, 10))
RETURNS VARCHAR(75)
AS
BEGIN
DECLARE @output VARCHAR(75)
DECLARE @wholenumber INT
DECLARE @DECIMAL DECIMAL(25, 10)
DECLARE @num INT
DECLARE @denom INT
DECLARE @multiple INT
SET @wholenumber = CAST(@NumToConvert AS INT)
SET @decimal = @NumToConvert - @wholenumber
SET @multiple = CAST('1' + REPLICATE('0', LEN(CAST(CAST(REVERSE(SUBSTRING(CAST(@decimal AS VARCHAR), CHARINDEX('.', CAST(@decimal AS VARCHAR)) + 1, LEN(CAST(@decimal AS VARCHAR)))) AS INT) AS VARCHAR(10)))) AS INT)
SET @num = @multiple * @decimal
SET @denom = @multiple
IF @num > 0
BEGIN
--calculate the greatest common factor
--AS long AS both numbers are even numbers, keep reducing them.
WHILE ((@num % 2) + (@denom % 2)) = 0
BEGIN
SET @denom = @denom / 2
SET @num = @num / 2
END
--continue reducing numerator and denominator until one
--is no longer evenly divisible by 5
WHILE ((@num % 5) + (@denom % 5)) = 0
BEGIN
SET @denom = @denom / 5
SET @num = @num / 5
END
SET @output = CASE
WHEN @wholenumber > 0
THEN CONVERT(VARCHAR, @wholenumber)
ELSE ''
END + ' ' + CONVERT(VARCHAR, @num) + '/' + CONVERT(VARCHAR, @denom)
END
ELSE
BEGIN
SET @output = @wholenumber
END
RETURN (@output)
END
GO
step2:
function to take care of the integer part (11 -> 0 ft, 12 -> 1 ft. 13 -> 1ft 1)
and tie it together with the decimal part
CREATE FUNCTION [dbo].[FeetInchesFraction](@V_INCHES DECIMAL(18,5))
RETURNS VARCHAR(20)
AS
BEGIN
RETURN(
SELECT CAST(FLOOR(@V_INCHES/12.0) AS VARCHAR)+' ft. '+CAST(FLOOR(@V_INCHES%12.0) AS VARCHAR)+'-' + ltrim(dbo.udf_ConvertToFraction(@V_INCHES%1.0)) + ' in.'
)
END
GO
Usage:
select [dbo].[FeetInchesFraction](13.01)
1 ft. 1-1/100 in.
select [dbo].[FeetInchesFraction](0.1)
0 ft. 0-1/10 in.
select [dbo].[udf_ConvertToFraction] (.25)
1/4
select [dbo].[udf_ConvertToFraction] (.3)
3/10