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

Terminal de Informação