domingo, 22 de agosto de 2010

Formatar dinheiro no SQL Server

Eu estou fazendo um sistema é dentre suas funcionalidades está a confecção de um contrato.
Eu tenho que montar a maior parte do contrato em um SELECT no MS SQLServer, então me deparei com um problema que deve ser muito comun. A conversão de campos do tipo DECIMAL ou FLOAT formatado. Quando uso o Convert(varchar, ValorContrato) ou Cast(ValorContrato as varchar) o retorno é R$1290232.32 quando o que preciso é R$12.902.232,32. Procurei e não encontrei então fiz a função que formata dinheiro. Segue o código:

CREATE FUNCTION FormatDinheiro(@Valor DECIMAL(20, 2))
RETURNS VARCHAR(30)
AS BEGIN
DECLARE
@ValorStr VARCHAR(30),
@Inteiro VARCHAR(30),
@Decimal VARCHAR(3),
@I INT,
@Count INT,
@IntLen INT

SET @ValorStr = CONVERT(VARCHAR(30), @Valor)

SET @ValorStr = RTRIM(LTRIM(REPLACE(@ValorStr, '.', '')))
SET @ValorStr = REPLACE(@ValorStr, ',', '')
SET @Inteiro = ''

IF (Len(@ValorStr) = 1)
BEGIN
SET @Inteiro = '0'
SET @Decimal = '0'+@ValorStr
END
ELSE
BEGIN
IF (Len(@ValorStr) = 2)
BEGIN
SET @Inteiro = '0'
SET @Decimal = @ValorStr
END
ELSE
BEGIN
SET @Decimal = Substring(@ValorStr, (Len(@ValorStr)-1), Len(@ValorStr))
SET @I = 3
SET @Count = 0
WHILE (@I <= Len(@ValorStr))
BEGIN
IF (@Count = 3)
BEGIN
SET @Inteiro = '.'+@Inteiro
SET @Count = 0
END
SET @IntLen = (Len(@ValorStr)+1)-@I
IF (@IntLen >= 0)
BEGIN
SET @Inteiro = Substring(@ValorStr, @IntLen, 1)+@Inteiro
END
SET @I = @I + 1
SET @Count = @Count + 1
END
END
END
IF (@Inteiro = '') SET @Inteiro = '0'
IF (@Decimal = '') SET @Decimal = '00'
RETURN @Inteiro+','+@Decimal
END

4 comentários:

Blogxões disse...

Fantastica a função...mto obrigado você salvou horas de trabalho..

Anônimo disse...

Tenho uma Função no SQL Server de 12 linhas que faz o mesmo
qlq coisa manda um email diego@blackdog.xyz

Unknown disse...

diego, me mande por favor essa funcao, se possivel
diego.bueno@totvs.com.br

Unknown disse...

Muito bom,funcionou perfeitamente para mim.

Agradeço por compartilhar seus conhecimentos.

Obrigado

Mário Sergio
maseroli@gmail.com