Transformação de variável numérica para texto em AdvPL

Olá pessoal…

Hoje vou mostrar, uma função que desenvolvi, que transforma o conteúdo de uma variável numérica, para caracter em AdvPL, respeitando número de dígitos e de dígitos decimais.

Geralmente quando fazemos alguma exportação, vem uma série de regras, como por exemplo, o campo ter 10 posições e mais 5 posições como decimais, e temos que fazer a conversão, utilizando várias funções, como StrZero, etc.

Pensando em otimizar isso, criei a rotina zTransNum, que recebe o valor numérico, a quantidade de posições, a quantidade de posições decimais, e se a quantidade de posições decimais, está junto da quantidade total de posições.

Abaixo o código fonte desenvolvido.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zTransNum
Função para conversão de valor numérico para texto conforme quantidade de decimais informada 
@author Daniel Atilio
@since  05/06/2014
@version 1.0
	@param nValor,		Numérico, Valor que será convertido
	@param nTotal,		Numérico, Quantidade total de casas
	@param nDec,		Numérico, Quantidade de casas decimais
	@param lConsDec,	Lógico,   Considera a quantidade de decimais no tamanho final
	@return cTexto, Conteúdo texto da conversão
	@example
	u_zTransNum(15.23, 5, 2)
/*/
 
User Function zTransNum(nValor, nTotal, nDec, lConsDec)
	Local cMascara := "@E 9,999,999,999,999,999,999"
	Local cTexto := ""
	Default lConsDec := .F.
	
	//Decimais
	cMascara += "."+Replicate('9',nDec)
	
	//Transformando conforme máscara
	cTexto := Alltrim(Transform(nValor,cMascara))
	
	//Retirando ponto e vírgula
	cTexto := StrTran(cTexto,',','')
	cTexto := StrTran(cTexto,'.','')
	
	//Colocando zeros a esquerda
	cTexto := StrZero(Val(cTexto),nTotal+Iif(lConsDec, nDec, 0))
	
/*	MsgInfo(	'nValor: '+cValToChar(nValor)+Chr(13)+Chr(10)+;
				'cMascara: '+cMascara+Chr(13)+Chr(10)+;
				'cTexto: '+cTexto+Chr(13)+Chr(10)+;
				'nTotal: '+cValToChar(nTotal)+Chr(13)+Chr(10)+;
				'nDec: '+cValToChar(nDec))*/
Return cTexto

E abaixo um print de um exemplo da rotina:

Exemplo da rotina zTransNum

Exemplo da rotina zTransNum

O diferencial dessa rotina com a StrZero / Transform, é que essa respeita os zeros a direita, ou seja, se eu tenho o valor 47,5 e quero que ele seja enviado com 3 casas decimais, o certo seria, 47500, porém com as outras rotinas isso não é possível.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Muito interessante. Material muito bom. seria legal deixa como instalar um ambiente de teste desse banco de dados para podermos testar!

Deixe uma resposta para Elizeu MarinoCancelar resposta

Terminal de Informação