jueves, 24 de diciembre de 2015

Cambiar número por letras desde SQL Server

Con esta función podréis cambiar un número en letras, esto os puede venir venir bien si por ejemplo queréis poner un número en un informe que requiera poner el importe en letras.

La función simplemente consiste en pasarle el número y devolverá este mismo transformado en una cadena de carácteres y formateado en letras.

ALTER function [dbo].[NumerosPalabras](@s VARCHAR(50)) RETURNS VARCHAR(1024)
AS
    BEGIN

    DECLARE @a char(1),@b char(1),@c char(1),@i int, @j int, @result VARCHAR(1024), @orlen int
    SET @orlen=LEN(@s)
    IF LEN(@s) % 3>0
        SET @s=' '+@S
    IF LEN(@s) % 3>0
        SET @s=' '+@S
    SET @i=1 SET @result=''
    IF LEN(@s) < 10 AND CAST(@s as DECIMAL(38, 10)) = 0
        SET @result='cero'

    WHILE @i<=LEN(@s)
        BEGIN

        SET @j=LEN(@s)-@i+1
        SET @a=substring(@s,@j,1)
        SET @b=substring(@s,@j-1,1)
        SET @c=substring(@s,@j-2,1)
        IF isnumeric(@a)=1
            BEGIN
            SET @result=CASE
                WHEN (@i-1=3) AND (@c+@b+@a<>'000') THEN 'mil'
                WHEN (@i-1=6) AND (@c+@b+@a<>'000') AND(@orlen=7)AND(@a='1') THEN 'millón '
                WHEN (@i-1=6) AND (@c+@b+@a<>'000') THEN 'millones '
                WHEN (@i-1=9) AND (@c+@b+@a<>'000') THEN 'mil millones'
                WHEN (@i-1=12) AND (@c+@b+@a<>'000') AND (@orlen=13)AND(@a='1') THEN 'billón '
                WHEN (@i-1=12) AND (@c+@b+@a<>'000') THEN 'billones '
                WHEN (@i-1=15) AND (@c+@b+@a<>'000') THEN 'mil billones'
                WHEN (@i-1=18) AND (@c+@b+@a<>'000') AND (@orlen=19)AND(@a='1') THEN 'trillón '
                WHEN (@i-1=18) AND (@c+@b+@a<>'000') THEN 'trillones '
                WHEN (@i-1=21) AND (@c+@b+@a<>'000') THEN 'mil trillones'
                WHEN (@i-1=24) AND (@c+@b+@a<>'000') AND (@orlen=25)AND(@a='1') THEN 'quadrillón '
                WHEN (@i-1=24) AND (@c+@b+@a<>'000') THEN 'quadrillones '
                WHEN (@i-1=27) AND (@c+@b+@a<>'000') THEN 'mil quadrillones'
                WHEN (@i-1=30) AND (@c+@b+@a<>'000') AND (@orlen=31)AND(@a='1') THEN 'quintillón '
                WHEN (@i-1=30) AND (@c+@b+@a<>'000') THEN 'quintillones '
                WHEN (@i-1=33) AND (@c+@b+@a<>'000') THEN 'mil quintillones'
                WHEN (@i-1=36) AND (@c+@b+@a<>'000') AND (@orlen=37)AND(@a='1') THEN 'sextillón '
                WHEN (@i-1=36) AND (@c+@b+@a<>'000') THEN 'sextillones '
                WHEN (@i-1=39) AND (@c+@b+@a<>'000') THEN 'mil sextillones'
                WHEN (@i-1=42) AND (@c+@b+@a<>'000') AND (@orlen=43)AND(@a='1') THEN 'septillón '
                WHEN (@i-1=42) AND (@c+@b+@a<>'000') THEN 'septillones '
                WHEN (@i-1=45) AND (@c+@b+@a<>'000') THEN 'mil septillones'
                WHEN (@i-1=48) AND (@c+@b+@a<>'000') AND (@orlen=49)AND(@a='1') THEN 'octillón '
                WHEN (@i-1=48) AND (@c+@b+@a<>'000') THEN 'octillones '
                WHEN (@i-1=51) AND (@c+@b+@a<>'000') THEN 'mil octillones'
                WHEN (@i-1=54) AND (@c+@b+@a<>'000') AND (@orlen=55)AND(@a='1') THEN 'nonillón '
                WHEN (@i-1=54) AND (@c+@b+@a<>'000') THEN 'nonillones '
                WHEN (@i-1=57) THEN 'mil nonillones'
                ELSE ''
                END+' '+@result
            IF(@b!='1' AND @b!='2') OR @b=' '
                SET @result=case @a
                        WHEN '1' THEN 'un'
                        WHEN '2' THEN 'dos'
                        WHEN '3' THEN 'tres'
                        WHEN '4' THEN 'cuatro'
                        WHEN '5' THEN 'cinco'
                        WHEN '6' THEN 'seis'
                        WHEN '7' THEN 'siete'
                        WHEN '8' THEN 'ocho'
                        WHEN '9' THEN 'nueve'
                        ELSE ''
                        END+' '+@result
            IF(isnumeric(@b)=1 )AND (@b!='0')
                IF @b='1' OR @b='2'
                SET @result=case @b+@a
                        WHEN '10' THEN 'diez'
                        WHEN '11' THEN 'once'
                        WHEN '12' THEN 'doce'
                        WHEN '13' THEN 'trece'
                        WHEN '14' THEN 'catorce'
                        WHEN '15' THEN 'quince'
                        WHEN '16' THEN 'dieciséis'
                        WHEN '17' THEN 'diecisiete'
                        WHEN '18' THEN 'dieciocho'
                        WHEN '19' THEN 'diecinueve'
                        WHEN '20' THEN 'veinte'
                        WHEN '21' THEN 'veintiuno'
                        WHEN '22' THEN 'veintidós'
                        WHEN '23' THEN 'veintitrés'
                        WHEN '24' THEN 'veinticuatro'
                        WHEN '25' THEN 'veinticinco'
                        WHEN '26' THEN 'veintiséis'
                        WHEN '27' THEN 'veintisiete'
                        WHEN '28' THEN 'veintiocho'
                        WHEN '29' THEN 'veintinueve'
                        ELSE ''
                        END+' '+@result
                ELSE
                SET @result=case @b
                        WHEN '3' THEN 'treinta'
                        WHEN '4' THEN 'cuarenta'
                        WHEN '5' THEN 'cincuenta'
                        WHEN '6' THEN 'sesenta'
                        WHEN '7' THEN 'setenta'
                        WHEN '8' THEN 'ochenta'
                        WHEN '9' THEN 'noventa'
                        ELSE ''
                        END+case @a WHEN '0' THEN '' ELSE ' y' END+' '+@result
            END
            IF (isnumeric(@c)=1)AND (@c!='0')
                IF @a='0' AND @b='0'
                    SET @result=case @c
                        WHEN '1' THEN 'cien'
                        WHEN '2' THEN 'doscientos'
                        WHEN '3' THEN 'trescientos'
                        WHEN '4' THEN 'cuatrocientos'
                        WHEN '5' THEN 'quinientos'
                        WHEN '6' THEN 'seiscientos'
                        WHEN '7' THEN 'setecientos'
                        WHEN '8' THEN 'ochocientos'
                        WHEN '9' THEN 'novecientos'
                    ELSE ''
                    END+' '+@result
                ELSE
                    SET @result=case @c
                        WHEN '1' THEN 'ciento'
                        WHEN '2' THEN 'doscientos'
                        WHEN '3' THEN 'trescientos'
                        WHEN '4' THEN 'cuatrocientos'
                        WHEN '5' THEN 'quinientos'
                        WHEN '6' THEN 'seiscientos'
                        WHEN '7' THEN 'setecientos'
                        WHEN '8' THEN 'ochocientos'
                        WHEN '9' THEN 'novecientos'
                    ELSE ''
                    END+' '+@result
        SET @i=@i+3
        END
    SET @result=LTRIM(RTRIM(@result))
    IF left(@result,7)='un mil '
        SET @result=right(@result,LEN(@result)-3)
    IF right(@result,3)=' un'
        SET @result=@result+'o'
    IF left(@result,2)='y '
        SET @result=right(@result,LEN(@result)-2)
    While CHARINDEX('  ', @result)>0
        SET @result=REPLACE(@result,'  ',' ')
    IF CHARINDEX('millones', @result) > 0
        SET @result=REPLACE(@result,'mil millones','mil')
    IF CHARINDEX('billones', @result) > 0
        SET @result=REPLACE(@result,'mil billones','mil')
    IF CHARINDEX('trillones', @result) > 0
        SET @result=REPLACE(@result,'mil trillones','mil')
    IF CHARINDEX('quadrillones', @result) > 0
        SET @result=REPLACE(@result,'mil quadrillones','mil')
    IF CHARINDEX('quintillones', @result) > 0
        SET @result=REPLACE(@result,'mil quintillones','mil')
    IF CHARINDEX('sextillones', @result) > 0
        SET @result=REPLACE(@result,'mil sextillones','mil')
    IF CHARINDEX('septillones', @result) > 0
        SET @result=REPLACE(@result,'mil septillones','mil')
    IF CHARINDEX('octillones', @result) > 0
        SET @result=REPLACE(@result,'mil octillones','mil')
    IF CHARINDEX('nonillones', @result) > 0
        SET @result=REPLACE(@result,'mil nonillones','mil')

    RETURN UPPER(LEFT(@result, 1)) + RIGHT(@result, LEN(@result) -1 )
END

No hay comentarios:

Publicar un comentario