Convert number to words - first, second, third and so on

不问归期 提交于 2019-11-28 08:43:15

This seems like a simpler approach, a nice recursive algorithm

CREATE FUNCTION fnIntegerToWords(@Number as BIGINT) 
    RETURNS VARCHAR(1024)
AS

BEGIN
      DECLARE @Below20 TABLE (ID int identity(0,1), Word varchar(32))
      DECLARE @Below100 TABLE (ID int identity(2,1), Word varchar(32))
      INSERT @Below20 (Word) VALUES 
                        ( 'Zero'), ('One'),( 'Two' ), ( 'Three'),
                        ( 'Four' ), ( 'Five' ), ( 'Six' ), ( 'Seven' ),
                        ( 'Eight'), ( 'Nine'), ( 'Ten'), ( 'Eleven' ),
                        ( 'Twelve' ), ( 'Thirteen' ), ( 'Fourteen'),
                        ( 'Fifteen' ), ('Sixteen' ), ( 'Seventeen'),
                        ('Eighteen' ), ( 'Nineteen' ) 

       INSERT @Below100 VALUES ('Twenty'), ('Thirty'),('Forty'), ('Fifty'),
                               ('Sixty'), ('Seventy'), ('Eighty'), ('Ninety')

    declare @belowHundred as varchar(126) 

    if @Number > 99 begin
        select @belowHundred = dbo.fnIntegerToWords( @Number % 100)
    end

    DECLARE @English varchar(1024) = 

    (

      SELECT Case 
        WHEN @Number = 0 THEN  ''

        WHEN @Number BETWEEN 1 AND 19 
          THEN (SELECT Word FROM @Below20 WHERE ID=@Number)

       WHEN @Number BETWEEN 20 AND 99   
         THEN  (SELECT Word FROM @Below100 WHERE ID=@Number/10)+ '-' +
               dbo.fnIntegerToWords( @Number % 10) 

       WHEN @Number BETWEEN 100 AND 999   
         THEN  (dbo.fnIntegerToWords( @Number / 100)) +' Hundred '+
             Case WHEN @belowHundred <> '' THEN 'and ' + @belowHundred else @belowHundred end 

       WHEN @Number BETWEEN 1000 AND 999999   
         THEN  (dbo.fnIntegerToWords( @Number / 1000))+' Thousand '+
             dbo.fnIntegerToWords( @Number % 1000)  

       WHEN @Number BETWEEN 1000000 AND 999999999   
         THEN  (dbo.fnIntegerToWords( @Number / 1000000))+' Million '+
             dbo.fnIntegerToWords( @Number % 1000000) 

       WHEN @Number BETWEEN 1000000000 AND 999999999999   
         THEN  (dbo.fnIntegerToWords( @Number / 1000000000))+' Billion '+
             dbo.fnIntegerToWords( @Number % 1000000000) 

            ELSE ' INVALID INPUT' END
    )

    SELECT @English = RTRIM(@English)

    SELECT @English = RTRIM(LEFT(@English,len(@English)-1))
        WHERE RIGHT(@English,1)='-'

    RETURN (@English)

END 

You need to use a CASE statement:

SELECT intfield CASE WHEN 1 THEN 'First'
                     WHEN 2 THEN 'Second'
                     WHEN 3 THEN 'Third'
                     ...other conversions...
                     ELSE '' END
FROM Mytable

EDIT:

Working code for 3 character numbers below. You can add the needed code below it for 2 and 1 character numbers (basically just modify what I wrote and change the SUBSTRINGs accordingly).

Essentially it converts the number to a string, checks how many numbers there are, then breaks it down accordingly.

DECLARE @n int = 515

DECLARE @v varchar(100) = CAST(@N as varchar)

SELECT CASE WHEN LEN(@v) = 3 THEN 
    (CASE   WHEN LEFT(@v, 1) = 1 THEN 'One Hundred'
            WHEN LEFT(@v, 1) = 2 THEN 'Two Hundred'
            WHEN LEFT(@v, 1) = 3 THEN 'Three Hundred'
            WHEN LEFT(@v, 1) = 4 THEN 'Four Hundred'
            WHEN LEFT(@v, 1) = 5 THEN 'Five Hundred'
            WHEN LEFT(@v, 1) = 6 THEN 'Six Hundred'
            WHEN LEFT(@v, 1) = 7 THEN 'Seven Hundred'
            WHEN LEFT(@v, 1) = 8 THEN 'Eight Hundred'
            WHEN LEFT(@v, 1) = 9 THEN 'Nine Hundred'
            ELSE '' END)
    + ' ' +
    (CASE   WHEN SUBSTRING(@v, 2, 1) = 2 THEN 'Twenty'
            WHEN SUBSTRING(@v, 2, 1) = 3 THEN 'Thirty'
            WHEN SUBSTRING(@v, 2, 1) = 4 THEN 'Forty'
            WHEN SUBSTRING(@v, 2, 1) = 5 THEN 'Fifty'
            WHEN SUBSTRING(@v, 2, 1) = 6 THEN 'Sixty'
            WHEN SUBSTRING(@v, 2, 1) = 7 THEN 'Seventy'
            WHEN SUBSTRING(@v, 2, 1) = 8 THEN 'Eighty'
            WHEN SUBSTRING(@v, 2, 1) = 9 THEN 'Ninety'
            WHEN SUBSTRING(@v, 2, 1) = 1 THEN 
                CASE    WHEN SUBSTRING(@v, 2, 2) = 10 THEN 'Ten'
                        WHEN SUBSTRING(@v, 2, 2) = 11 THEN 'Eleven'
                        WHEN SUBSTRING(@v, 2, 2) = 12 THEN 'Twelve'
                        WHEN SUBSTRING(@v, 2, 2) = 13 THEN 'Thirteen'
                        WHEN SUBSTRING(@v, 2, 2) = 14 THEN 'Fourteen'
                        WHEN SUBSTRING(@v, 2, 2) = 15 THEN 'Fifteen'
                        WHEN SUBSTRING(@v, 2, 2) = 16 THEN 'Sixteen'
                        WHEN SUBSTRING(@v, 2, 2) = 17 THEN 'Seventeen'
                        WHEN SUBSTRING(@v, 2, 2) = 18 THEN 'Eighteen'
                        WHEN SUBSTRING(@v, 2, 2) = 19 THEN 'Nineteen'
                        ELSE '' END




            ELSE '' END)
    + ' ' +
    (CASE   WHEN SUBSTRING(@v, 2, 1) = 1 THEN ''
            WHEN SUBSTRING(@v, 3, 1) = 2 THEN 'Two'
            WHEN SUBSTRING(@v, 3, 1) = 3 THEN 'Three'
            WHEN SUBSTRING(@v, 3, 1) = 4 THEN 'Four'
            WHEN SUBSTRING(@v, 3, 1) = 5 THEN 'Five'
            WHEN SUBSTRING(@v, 3, 1) = 6 THEN 'Six'
            WHEN SUBSTRING(@v, 3, 1) = 7 THEN 'Seven'
            WHEN SUBSTRING(@v, 3, 1) = 8 THEN 'Eight'
            WHEN SUBSTRING(@v, 3, 1) = 9 THEN 'Nine'
            WHEN SUBSTRING(@v, 3, 1) = 1 THEN 'One'
            ELSE '' END)
    END

Also, you can CREATE TABLE with numbers and their names.

CREATE TABLE tblNumbers (Nmb int, NmbWord varchar(100))
INSERT INTO tblNumbers 
VALUES (1,'first'), (2,'second'),(3,'third'), (4,'forth')

CREATE TABLE SomeTable (nmb int)

INSERT INTO SomeTable 
VALUES (1), (1),(2),(3)

SELECT  N.*
FROM tblNumbers N
     JOIN SomeTable ST ON ST.nmb=N.Nmb

DROP TABLE tblNumbers
DROP TABLE SomeTable

This should work up to 999...

IF OBJECT_ID('tempdb..#numbers_list') IS NOT NULL DROP TABLE #numbers_list
CREATE TABLE #numbers_list (int_value INT, text_value VARCHAR(100))
INSERT INTO #numbers_list
SELECT 1 as int_value, 'One' as text_value UNION ALL
SELECT 2 as int_value, 'Two' as text_value UNION ALL
SELECT 3 as int_value, 'Three' as text_value UNION ALL
SELECT 4 as int_value, 'Four' as text_value UNION ALL
SELECT 5 as int_value, 'Five' as text_value UNION ALL
SELECT 6 as int_value, 'Six' as text_value UNION ALL
SELECT 7 as int_value, 'Seven' as text_value UNION ALL
SELECT 8 as int_value, 'Eight' as text_value UNION ALL
SELECT 9 as int_value, 'Nine' as text_value UNION ALL
SELECT 10 as int_value, 'Ten' as text_value UNION ALL
SELECT 11 as int_value, 'Eleven' as text_value UNION ALL
SELECT 12 as int_value, 'Twelve' as text_value UNION ALL
SELECT 13 as int_value, 'Thirteen' as text_value UNION ALL
SELECT 14 as int_value, 'Fourteen' as text_value UNION ALL
SELECT 15 as int_value, 'Fifteen' as text_value UNION ALL
SELECT 16 as int_value, 'Sixteen' as text_value UNION ALL
SELECT 17 as int_value, 'Seventeen' as text_value UNION ALL
SELECT 18 as int_value, 'Eighteen' as text_value UNION ALL
SELECT 19 as int_value, 'Nineteen' as text_value UNION ALL
SELECT 20 as int_value, 'Twenty' as text_value UNION ALL
SELECT 30 as int_value, 'Thirty' as text_value UNION ALL
SELECT 40 as int_value, 'Fourty' as text_value UNION ALL
SELECT 50 as int_value, 'Fifty' as text_value UNION ALL
SELECT 60 as int_value, 'Sixty' as text_value UNION ALL
SELECT 70 as int_value, 'Seventy' as text_value UNION ALL
SELECT 80 as int_value, 'Eighty' as text_value UNION ALL
SELECT 90 as int_value, 'Ninety' as text_value UNION ALL
SELECT 100 AS int_value, 'One Hundred' AS text_value

SELECT 
tst2.number
,CASE WHEN exact.text_value IS NOT NULL THEN exact.text_value 
        WHEN tst2.number > 100 AND COALESCE(tens.text_value,ones.text_value) IS NULL THEN hunds.text_value + ' Hundred'
        WHEN tst2.number > 100 AND tst2.number_of_ones = 0 THEN hunds.text_value + ' Hundred And ' + tens.text_value
        WHEN tst2.number > 100 AND tst2.number_of_tens = 0 THEN hunds.text_value + ' Hundred And ' + ones.text_value
        WHEN tst2.number > 100 THEN hunds.text_value + ' Hundred And ' + tens.text_value + ' ' + ones.text_value
        WHEN tst2.number > 10 THEN tens.text_value + ' ' + ones.text_value
END AS string
FROM
(
SELECT tst.number
,tst.number % 10 as number_of_ones
,CASE WHEN tst.number < 101 THEN tst.number - (tst.number % 10) 
    WHEN tst.number > 100 THEN tst.number - 100 * (FLOOR(tst.number / 100)) - (tst.number % 10)
END as number_of_tens
,tst.number / 100 as number_of_hundreds
FROM 
(
SELECT 22 as number UNION ALL
SELECT 27 UNION ALL
SELECT 10 UNION ALL
SELECT 101 UNION ALL
SELECT 200 UNION ALL
SELECT 227
) tst
) tst2
LEFT OUTER JOIN #numbers_list exact on exact.int_value = tst2.number --if an exact match
LEFT OUTER JOIN #numbers_list ones on ones.int_value = tst2.number_of_ones 
LEFT OUTER JOIN #numbers_list tens on tens.int_value = tst2.number_of_tens
LEFT OUTER JOIN #numbers_list hunds on hunds.int_value = tst2.number_of_hundreds
Mohamed Al Kurwi

I Just Updated a function in MySql from 999 up to 999999999 number

this is the link to the original one:Reference

And the Updated one is bellow:


CREATE FUNCTION `number_to_string`(n INT) RETURNS varchar(1000) CHARSET latin1 BEGIN
    declare ans varchar(1000);
    declare dig1, dig2, dig3,dig4,dig5,dig6,dig7,dig8,dig9 int;

    set ans = '';
    set dig9 = floor(n/100000000);
    set dig8 = floor(n/10000000) - dig9*10;
    set dig7 = floor(n/1000000) -(floor(n/10000000)*10);
    set dig6 = floor(n/100000) - (floor(n/1000000)*10);
    set dig5 = floor(n/10000) -  (floor(n/100000)*10);
    set dig4 = floor(n/1000) -   (floor(n/10000)*10);
    set dig3 = floor(n/100) -    (floor(n/1000)*10);
    set dig2 = floor(n/10) -     (floor(n/100)*10);
    set dig1 = n - (floor(n / 10)*10);

If dig9 > 0 then

        case
            when dig9=1 then set ans=concat(ans, 'One Hundred');
            when dig9=2 then set ans=concat(ans, 'Two Hundred');
            when dig9=3 then set ans=concat(ans, 'Three Hundred');
            when dig9=4 then set ans=concat(ans, 'Four Hundred');
            when dig9=5 then set ans=concat(ans, 'Five Hundred');
            when dig9=6 then set ans=concat(ans, 'Six Hundred');
            when dig9=7 then set ans=concat(ans, 'Seven Hundred');
            when dig9=8 then set ans=concat(ans, 'Eight Hundred');
            when dig9=9 then set ans=concat(ans, 'Nine Hundred');
            else set ans = ans;
        end case;
         if ans <> '' and dig8 =0 and dig7 = 0 then
            set ans=concat(ans, ' Million');
        end if;
    end if;
    if ans <> '' and dig8 > 0 then
        set ans=concat(ans, ' And ');
    end if;
    if dig8 = 1 then
        case
            when (dig8*10 + dig7) = 10 then set ans=concat(ans,'Ten Million');
            when (dig8*10 + dig7) = 11 then set ans=concat(ans,'Eleven Million');
            when (dig8*10 + dig7) = 12 then set ans=concat(ans,'Twelve Million');
            when (dig8*10 + dig7) = 13 then set ans=concat(ans,'Thirteen Million');
            when (dig8*10 + dig7) = 14 then set ans=concat(ans,'Fourteen Million');
            when (dig8*10 + dig7) = 15 then set ans=concat(ans,'Fifteen Million');
            when (dig8*10 + dig7) = 16 then set ans=concat(ans,'Sixteen Million');
            when (dig8*10 + dig7) = 17 then set ans=concat(ans,'Seventeen Million');
            when (dig8*10 + dig7) = 18 then set ans=concat(ans,'Eighteen Million');
            when (dig8*10 + dig7) = 19 then set ans=concat(ans,'Nineteen Million');
            else set ans=ans;
        end case;
    else
        if dig8 > 0 then
            case
                when dig8=2 then set ans=concat(ans, ' Twenty');
                when dig8=3 then set ans=concat(ans, ' Thirty');
                when dig8=4 then set ans=concat(ans, ' Fourty');
                when dig8=5 then set ans=concat(ans, ' Fifty');
                when dig8=6 then set ans=concat(ans, ' Sixty');
                when dig8=7 then set ans=concat(ans, ' Seventy');
                when dig8=8 then set ans=concat(ans, ' Eighty');
                when dig8=9 then set ans=concat(ans, ' Ninety');
                else set ans=ans;
            end case;
            if ans <> '' and dig7 =0 then
            set ans=concat(ans, ' Million');
            end if;
        end if;
        if ans <> '' and dig7 > 0 and dig8 =0 then
        set ans=concat(ans, ' And ');
        end if;
        if dig7 > 0 then
        case
            when dig7=1 then set ans=concat(ans, ' One Million');
            when dig7=2 then set ans=concat(ans, ' Two Million');
            when dig7=3 then set ans=concat(ans, ' Three Million');
            when dig7=4 then set ans=concat(ans, ' Four Million');
            when dig7=5 then set ans=concat(ans, ' Five Million');
            when dig7=6 then set ans=concat(ans, ' Six Million');
            when dig7=7 then set ans=concat(ans, ' Seven Million');
            when dig7=8 then set ans=concat(ans, ' Eight Million');
            when dig7=9 then set ans=concat(ans, ' Nine Million');
            else set ans = ans;
        end case;
    end if;
end if;
    if ans <> '' and dig6 > 0 then
        set ans=concat(ans, ' And ');
    end if;

    if dig6 > 0 then
        case
            when dig6=1 then set ans=concat(ans, 'One Hundred');
            when dig6=2 then set ans=concat(ans, 'Two Hundred');
            when dig6=3 then set ans=concat(ans, 'Three Hundred');
            when dig6=4 then set ans=concat(ans, 'Four Hundred');
            when dig6=5 then set ans=concat(ans, 'Five Hundred');
            when dig6=6 then set ans=concat(ans, 'Six Hundred');
            when dig6=7 then set ans=concat(ans, 'Seven Hundred');
            when dig6=8 then set ans=concat(ans, 'Eight Hundred');
            when dig6=9 then set ans=concat(ans, 'Nine Hundred');
            else set ans = ans;
        end case;
         if ans <> '' and dig4 =0 and dig5 = 0 then
            set ans=concat(ans, ' Thousand');
        end if;
    end if;
    if ans <> '' and dig5 > 0 then
        set ans=concat(ans, ' And ');
    end if;
    if dig5 = 1 then
        case
            when (dig5*10 + dig4) = 10 then set ans=concat(ans,'Ten Thousand');
            when (dig5*10 + dig4) = 11 then set ans=concat(ans,'Eleven Thousand');
            when (dig5*10 + dig4) = 12 then set ans=concat(ans,'Twelve Thousand');
            when (dig5*10 + dig4) = 13 then set ans=concat(ans,'Thirteen Thousand');
            when (dig5*10 + dig4) = 14 then set ans=concat(ans,'Fourteen Thousand');
            when (dig5*10 + dig4) = 15 then set ans=concat(ans,'Fifteen Thousand');
            when (dig5*10 + dig4) = 16 then set ans=concat(ans,'Sixteen Thousand');
            when (dig5*10 + dig4) = 17 then set ans=concat(ans,'Seventeen Thousand');
            when (dig5*10 + dig4) = 18 then set ans=concat(ans,'Eighteen Thousand');
            when (dig5*10 + dig4) = 19 then set ans=concat(ans,'Nineteen Thousand');
            else set ans=ans;
        end case;
    else
        if dig5 > 0 then
            case
                when dig5=2 then set ans=concat(ans, ' Twenty');
                when dig5=3 then set ans=concat(ans, ' Thirty');
                when dig5=4 then set ans=concat(ans, ' Fourty');
                when dig5=5 then set ans=concat(ans, ' Fifty');
                when dig5=6 then set ans=concat(ans, ' Sixty');
                when dig5=7 then set ans=concat(ans, ' Seventy');
                when dig5=8 then set ans=concat(ans, ' Eighty');
                when dig5=9 then set ans=concat(ans, ' Ninety');
                else set ans=ans;
            end case;
            if ans <> '' and dig4 =0 then
            set ans=concat(ans, ' Thousand');
            end if;
        end if;
        if ans <> '' and dig4 > 0 and dig5 =0 then
        set ans=concat(ans, ' And ');
        end if;
        if dig4 > 0 then
        case
            when dig4=1 then set ans=concat(ans, ' One Thousand');
            when dig4=2 then set ans=concat(ans, ' Two Thousand');
            when dig4=3 then set ans=concat(ans, ' Three Thousand');
            when dig4=4 then set ans=concat(ans, ' Four Thousand');
            when dig4=5 then set ans=concat(ans, ' Five Thousand');
            when dig4=6 then set ans=concat(ans, ' Six Thousand');
            when dig4=7 then set ans=concat(ans, ' Seven Thousand');
            when dig4=8 then set ans=concat(ans, ' Eight Thousand');
            when dig4=9 then set ans=concat(ans, ' Nine Thousand');
            else set ans = ans;
        end case;
    end if;
end if;
    if ans <> '' and dig3 > 0 then
        set ans=concat(ans, ' And ');
    end if;
    if dig3 > 0 then
        case
            when dig3=1 then set ans=concat(ans, 'One Hundred');
            when dig3=2 then set ans=concat(ans, 'Two Hundred');
            when dig3=3 then set ans=concat(ans, 'Three Hundred');
            when dig3=4 then set ans=concat(ans, 'Four Hundred');
            when dig3=5 then set ans=concat(ans, 'Five Hundred');
            when dig3=6 then set ans=concat(ans, 'Six Hundred');
            when dig3=7 then set ans=concat(ans, 'Seven Hundred');
            when dig3=8 then set ans=concat(ans, 'Eight Hundred');
            when dig3=9 then set ans=concat(ans, 'Nine Hundred');
            else set ans = ans;
        end case;
    end if;
    if ans <> '' and dig2 > 0 then
        set ans=concat(ans, ' And ');
    end if;
    if dig2 = 1 then
        case
            when (dig2*10 + dig1) = 10 then set ans=concat(ans,'Ten');
            when (dig2*10 + dig1) = 11 then set ans=concat(ans,'Eleven');
            when (dig2*10 + dig1) = 12 then set ans=concat(ans,'Twelve');
            when (dig2*10 + dig1) = 13 then set ans=concat(ans,'Thirteen');
            when (dig2*10 + dig1) = 14 then set ans=concat(ans,'Fourteen');
            when (dig2*10 + dig1) = 15 then set ans=concat(ans,'Fifteen');
            when (dig2*10 + dig1) = 16 then set ans=concat(ans,'Sixteen');
            when (dig2*10 + dig1) = 17 then set ans=concat(ans,'Seventeen');
            when (dig2*10 + dig1) = 18 then set ans=concat(ans,'Eighteen');
            when (dig2*10 + dig1) = 19 then set ans=concat(ans,'Nineteen');
            else set ans=ans;
        end case;
    else
        if dig2 > 0 then
            case
                when dig2=2 then set ans=concat(ans, ' Twenty');
                when dig2=3 then set ans=concat(ans, ' Thirty');
                when dig2=4 then set ans=concat(ans, ' Fourty');
                when dig2=5 then set ans=concat(ans, ' Fifty');
                when dig2=6 then set ans=concat(ans, ' Sixty');
                when dig2=7 then set ans=concat(ans, ' Seventy');
                when dig2=8 then set ans=concat(ans, ' Eighty');
                when dig2=9 then set ans=concat(ans, ' Ninety');
                else set ans=ans;
            end case;
        end if;
        if ans <> '' and dig1 > 0 and dig2 =0 then
        set ans=concat(ans, ' And ');
        end if;
        if dig1 > 0 then
            case
                when dig1=1 then set ans=concat(ans, ' One');
                when dig1=2 then set ans=concat(ans, ' Two');
                when dig1=3 then set ans=concat(ans, ' Three');
                when dig1=4 then set ans=concat(ans, ' Four');
                when dig1=5 then set ans=concat(ans, ' Five');
                when dig1=6 then set ans=concat(ans, ' Six');
                when dig1=7 then set ans=concat(ans, ' Seven');
                when dig1=8 then set ans=concat(ans, ' Eight');
                when dig1=9 then set ans=concat(ans, ' Nine');
                else set ans=ans;
            end case;
        end if;
    end if;

    return trim(ans);
    END

I tested it like that: select number_to_string(999999999)

and results: 'Nine Hundred And Ninety Nine Million And Nine Hundred And Ninety Nine Thousand And Nine Hundred And Ninety Nine'

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!