Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Mensagem por NiltonGM »

Pessoal, como vão todos?
Alguém já teve esse problema ao converter um Hash Table em JSON usando hb_jsonEncode(hBody, 4), os campos numéricos com casas decimais zerada é ignorado, tipo 340.0000 ou 30.00, as casas decimais são ignorados mostrando os valores inteiros.
Screenshot_20231003_123935.png
Nos testes que fiz no playgroud https://os.allcom.pl/harbour/ isso não acontece, não uso SET FIXED ON e nem SET DECIMALS TO n

Código: Selecionar todos

PROCEDURE Main
   LOCAL hTeste := {=>}
   LOCAL jsonText
   
	? 25141251 / 362
	? 214514.214 / 6325

   hTeste['Produto'] := "UltraMegaPower PC com estonteantes 4MB RAM 386Plus"
   hTeste['Preco1'] := 343.0000
   hTeste['Preco2'] := 71.01
   hTeste['Preco3'] := 65.00457
   
   ? "Produto:", hTeste['Produto']
   ? "Preço 1", hTeste['Preco1']
   ? "Preço 2", hTeste['Preco2']
   ? "Preço 3", hTeste['Preco3']
   ? 
   
   jsonText := hb_jsonEncode(hTeste, 4)
   ?
   ? jsonText
      
RESULTADO:
69450.97
33.92
Produto: UltraMegaPower PC com estonteantes 4MB RAM 386Plus
Preço 1 343.0000
Preço 2 71.01
Preço 3 65.00457


{
"Produto": "UltraMegaPower PC com estonteantes 4MB RAM 386Plus",
"Preco1": 343.0000,
"Preco2": 71.01,
"Preco3": 65.00457
}

Program exited.
Grato!
Nilton Medeiros
nilton@sistrom.com.br
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Mensagem por Kapiaba »

Já testou com o comando SET DECIMALS TO?

Abs. Regards, saludos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Mensagem por JoséQuintas »

Mas número é número, não precisa decimais zeradas.
Isso seria problema da rotina do outro lado.

O programa do governo pra SCANC feito em Delphi tem esse tipo de problema.
É como se ele usasse inteiro ou double baseado no que está sendo importado.
Mas ele usa TXT e não json.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Mensagem por NiltonGM »

Kapiaba escreveu:Já testou com o comando SET DECIMALS TO?

Abs. Regards, saludos.
Kapiaba. Sim, testei e problema persiste, mas a nuvem fiscal resolve isso ao gerar o XML.
JoséQuintas escreveu:Mas número é número, não precisa decimais zeradas.
Isso seria problema da rotina do outro lado.

O programa do governo pra SCANC feito em Delphi tem esse tipo de problema.
É como se ele usasse inteiro ou double baseado no que está sendo importado.
Mas ele usa TXT e não json.
José Quintas, concordo, número é numero, eu iria resolver da seguinte forma, todo valor numérico eu ia salvar como string adicionado nas duas extremidades do string o caracter # (ficando assim: "valor": "#35.2548#"), depois usaria o Strtrans() para trocar no texto json tudo que é ["#] por "" e [#"] também por "", mas deixei como está pois a api da Nuvem Fiscal trata isso corretamente ao gerar o XML do CTe.
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Mensagem por JoséQuintas »

Em stored procedure/function mais fácil ainda.

Código: Selecionar todos

CREATE FUNCTION ze_xmlnfeprodutoipi( nIdItPed INT(11) )
RETURNS TEXT CHARSET latin1

BEGIN

   DECLARE cIpiCst, cIpiEnq VARCHAR(10) DEFAULT '';
   DECLARE nIpiBas, nIpiAli, nIpiVal DECIMAL(16,2) DEFAULT 0;
   DECLARE cXml TEXT;

   SELECT
      COALESCE( IPIPICST, '' ),
      COALESCE( IPIPIBAS, 0 ),
      COALESCE( IPIPIALI, 0 ),
      COALESCE( IPIPIVAL, 0 ),
      IPIPIENQ
   FROM JPITPED
   LEFT JOIN JPITEM ON IDPRODUTO = IPPRODUTO
   WHERE IDITPED = nIdItPed
   INTO cIpiCst, nIpiBas, nIpiAli, nIpiVal, cIpiEnq ;

   IF LENGTH( cIpiCst ) = 0 OR LENGTH( cIpiEnq ) = 0 THEN
      RETURN '';
   END IF;

   SET cXml := CONCAT(
      '<IPI>',
      ze_XmlTag( 'cEnq', cIpiEnq ),
      IF( nIpiVal = 0,
         CONCAT( '<IPINT>',
            ze_XmlTag( 'CST', cIpiCst ), /* valem 01,02,03,04,05,51,52,53,54,55 */
            '</IPINT>' ),
         CONCAT( '<IPITrib>',
            ze_XmlTag( 'CST',  cIpiCst ), /* 00,49,50,99 */
            ze_XmlTag( 'vBC',  nIpiBas ),
            ze_XmlTag( 'pIPI', nIpiAli ),
            ze_XmlTag( 'vIPI', nIpiVal ),
            '</IPITrib>' ) ),
         '</IPI>' );

   RETURN cXml;

END;
E dá pra simplificar um pouquinho.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Casas Decimais no JSON quando é .00 ou .0000 é ignorado

Mensagem por JoséQuintas »

Sei lá se simplificou.....

Código: Selecionar todos

   IF nIPIVal = 0 THEN
      /* valem 01,02,03,04,05,51,52,53,54,55 */
      SET cXml := ze_XmlTag( 'IPINT', ze_XmlTag( 'CST', cIpiCst ) ); 
   ELSE
      /* 00,49,50,99 */
      SET cXml := ze_XmlTag( 'IPITribut', 
         CONCAT( ze_XmlTag( 'CST',  cIpiCst ), 
            ze_XmlTag( 'vBC',  nIpiBas ),
            ze_XmlTag( 'pIPI', nIpiAli ),
            ze_XmlTag( 'vIPI', nIpiVal ) ) );
   END IF;
   
   SET cXml := ze_XmlTag( 'IPI', CONCAT( ze_XmlTag( 'cEnq', cIpiEnq ), cXml ) );

   RETURN cXml;
Nota: é que só olhei agora que postei, e vi que dava pra mexer.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder