Jump to content
jothaz

Formatar valores numéricos no SQL

Recommended Posts

A idéia é criar uma função de usuário para mascarar/formatar valores numéricos e monetários direto no SQL.

 

create  FUNCTION FormataValor(@Valor Decimal(18,4),@SepMilhar char(1),@SepDecimal Char(1))Returns  Varchar(50) ASBegin  Declare @Inteiro int,		  @Texto varchar(50),		  @ValorDecimal varchar(04)  Set @Texto = RTrim(Cast(@Valor as varchar(50)))  Set @Inteiro = Cast(@Valor as Integer)  Set @ValorDecimal = SubString(@Texto,Len(@Texto)-3,4)  If Len(@Inteiro) = 4	 Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,1) + @SepMilhar +  SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepDecimal + @ValorDecimal  If Len(@Inteiro) = 5	 Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,2) + @SepMilhar +  SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepDecimal + @ValorDecimal  If Len(@Inteiro) = 6	 Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,3) + @SepMilhar +  SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepDecimal + @ValorDecimal  Return @TextoEnd
Para utlizá-la:

SELECT dbo.FormataValor(2560.69,'.',',')
OBS: sempre utilizar o . (ponto) como separador de decimal.

 

Espero que possa ser útil a alguém.

 

Fonte/Autor/link

AUTOR: Adaptei esta função de um post do forum imasters (do qual não tenho o link). Caso alguém seja o autor favor postar o link para que os créditos possam ser atribuido.

 

Dúvidas, criticas, contribuições, correções e adições serão bem vindas.

Share this post


Link to post
Share on other sites

Olá. Tomei a liberdade de melhorar a function do colega acima e corrigir um erro pra valores com 6 casas.

Agora está funcionando perfeitamente, segundo meus testes.

 

Abraço

 

create FUNCTION FormataValor(@Valor Numeric(18,4),@SepMilhar char(1),@SepDecimal Char(1))

Returns Varchar(50) AS

Begin

Declare @Inteiro int,

@Texto varchar(50),

@ValorDecimal varchar(04)

 

Set @Texto = RTrim(Cast(@Valor as varchar(50)))

Set @Inteiro = Cast(@Valor as Integer)

Set @ValorDecimal = SubString(@Texto,Len(@Texto)-3,2)

 

If Len(@Inteiro) = 1

Set @Texto = Cast(@Inteiro as varchar(10)) + Replace(@SepMilhar, '.',',') + @ValorDecimal

 

If Len(@Inteiro) = 2

Set @Texto = Cast(@Inteiro as varchar(10)) + Replace(@SepMilhar, '.',',') + @ValorDecimal

 

If Len(@Inteiro) = 3

Set @Texto = Cast(@Inteiro as varchar(10)) + Replace(@SepMilhar, '.',',') + @ValorDecimal

 

If Len(@Inteiro) = 4

Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,1) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepDecimal + @ValorDecimal

 

If Len(@Inteiro) = 5

Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,2) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),3,5) + @SepDecimal + @ValorDecimal

 

If Len(@Inteiro) = 6

Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),4,7) + @SepDecimal + @ValorDecimal

 

If Len(@Inteiro) = 7

Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,1) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),2,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),5,7) + @SepDecimal + @ValorDecimal

 

Return @Texto

End

 

--para chamar a function

--SELECT dbo.FormataValor(1234567.99,'.',',')

Share this post


Link to post
Share on other sites

If Len(@Inteiro) = 8

Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,2) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),3,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),6,7) + @SepDecimal + @ValorDecimal

 

If Len(@Inteiro) = 9

Set @Texto = SubString(Cast(@Inteiro as varchar(10)),1,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),3,3) + @SepMilhar + SubString(Cast(@Inteiro as varchar(10)),7,7) + @SepDecimal + @ValorDecimal

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.