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: 1912
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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