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:
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.

Muito interessante. Material muito bom. seria legal deixa como instalar um ambiente de teste desse banco de dados para podermos testar!
Boa noite Elizeu.
Ótima ideia, irei analisar a viabilidade.
Um grande abraço.