Ir para conteúdo
  • Cadastre-se

dev botao

Recommended Posts

Postado

uso lazarus 32 bits 2.0.10 windows 10

eu tenho um campo VALOR no banco firebird do tipo DOUBLE PRECISION
com o valor: 1,23456

quando eu vou gerar um json com fpjon assim:
jsObjValues.Add('VALOR', aDataSet.FieldByName('VALOR').AsFloat)
o resultado é esse:
"VALOR": 1.2345600000000000E+002

se eu fizer assim:
jsObjValues.Add('VALOR', 1.23456)
o resultado é esse:
"VALOR": 1.2345600000000000E+001

no delphi funciona certinho
"VALOR": 1.23456

só para comparação:
o campo ID é do tipo integer

assim funciona:
FieldByName('ID').AsInteger
"ID": 1,

assim não funciona:
FieldByName('ID').AsFloat
"ID": 1.0000000000000000E+000,

alguem sabe como resolver no lazarus?

Postado
6 minutos atrás, Daniel Simoes disse:

Use "AsCurrency", que sempre será delimitado em 4 casas decimais

ja tentei tambem, eu vi isso em outro post aqui mas não resolveu.

segue um exemplo:

o codigo é esse:
uses
fpjson

procedure TForm1.Button1Click(Sender: TObject);
Var
  jsObjValues: TJSONObject;
begin
  jsObjValues := TJSONObject.Create;
  jsObjValues.Add('VALOR',1.23456 );
  ShowMessage(jsObjValues.AsJSON);
end;

 

Postado

Com esse teste:

var
  jsObjValues: TJSONObject;
  rValor: real;
  cValor: currency;
  sValor: single;
  dValor: double;
begin
  rValor := 1.23456;
  cValor := 1.23456;
  sValor := 1.23456;
  dValor := 1.23456;

  jsObjValues := TJSONObject.Create;
  jsObjValues.Add('REAL', rValor);
  jsObjValues.Add('CURRENCY', cValor);
  jsObjValues.Add('SINGLE', sValor);
  jsObjValues.Add('DOUBLE', dValor);

  Memo1.Text := jsObjValues.AsJSON;

olha o resultado:

{
"REAL":1.2345600000000001E+000,
"CURRENCY":1.2345999999999999E+000,
"SINGLE":1.2345600128173828E+000,
"DOUBLE":1.2345600000000001E+000
}

nada funciona, não sei o que fazer

Postado (editado)
19 minutos atrás, Daniel Simoes disse:

O resultado do JSON, não é lido pelo outro lado ?

pra falar e verdade eu não sei pois ele não vai ser lido por mim,

mas eu resolvi usando json4delphi (que esta na pasta "Fontes\Terceiros" do acbr)e nele funciona certinho,

é algum problema no fpjson que eu não consegui resolver.

eu só não queria depender de nenhum componente externo pois é um projeto simples e eu vou ter que entregar os fontes para o cliente

e ele não quer dependência externa para não gerar quebra quando houver uma possível migração ou atualização

Editado por datilas
  • Curtir 1
  • 4 anos depois...
Postado
Em 29/10/2020 at 15:22, datilas disse:

Com esse teste:

var
  jsObjValues: TJSONObject;
  rValor: real;
  cValor: currency;
  sValor: single;
  dValor: double;
begin
  rValor := 1.23456;
  cValor := 1.23456;
  sValor := 1.23456;
  dValor := 1.23456;

  jsObjValues := TJSONObject.Create;
  jsObjValues.Add('REAL', rValor);
  jsObjValues.Add('CURRENCY', cValor);
  jsObjValues.Add('SINGLE', sValor);
  jsObjValues.Add('DOUBLE', dValor);

  Memo1.Text := jsObjValues.AsJSON;

olha o resultado:

{
"REAL":1.2345600000000001E+000,
"CURRENCY":1.2345999999999999E+000,
"SINGLE":1.2345600128173828E+000,
"DOUBLE":1.2345600000000001E+000
}

nada funciona, não sei o que fazer

just do the below:

program newtestfpjson;

uses sysutils
   , fpjson
   ;

type

  TJSONFloat4Number = class(TJSONFloatNumber)
  protected
    function GetAsString: TJSONStringType; override;
  end;

  function TJSONFloat4Number.GetAsString: TJSONStringType;
  var
    F: TJSONFloat;
  begin
    F := GetAsFloat;
    Str(F:0:4, Result); // format with your preferences
  end;

var
  jsObjValues: TJSONObject;
  rValor: real;
  cValor: currency;
  sValor: single;
  dValor: double;

begin
  SetJSONInstanceType(jitNumberFloat, TJSONFloat4Number);

  rValor := 1.23456;
  cValor := 1.23456;
  sValor := 1.23456;
  dValor := 1.23456;

  jsObjValues := TJSONObject.Create;
  jsObjValues.Add('REAL', rValor);
  jsObjValues.Add('CURRENCY', cValor);
  jsObjValues.Add('SINGLE', sValor);
  jsObjValues.Add('DOUBLE', dValor);

  WriteLn(jsObjValues.FormatJSON());
  ReadLn();
end.

 

And the output:

 

{
  "REAL" : 1.2346,
  "CURRENCY" : 1.2346,
  "SINGLE" : 1.2346,
  "DOUBLE" : 1.2346
}

  • Curtir 1
  • Moderadores
Postado
1 hora atrás, JOSE CHAO disse:

just do the below:

program newtestfpjson;

uses sysutils
   , fpjson
   ;

type

  TJSONFloat4Number = class(TJSONFloatNumber)
  protected
    function GetAsString: TJSONStringType; override;
  end;

  function TJSONFloat4Number.GetAsString: TJSONStringType;
  var
    F: TJSONFloat;
  begin
    F := GetAsFloat;
    Str(F:0:4, Result); // format with your preferences
  end;

var
  jsObjValues: TJSONObject;
  rValor: real;
  cValor: currency;
  sValor: single;
  dValor: double;

begin
  SetJSONInstanceType(jitNumberFloat, TJSONFloat4Number);

  rValor := 1.23456;
  cValor := 1.23456;
  sValor := 1.23456;
  dValor := 1.23456;

  jsObjValues := TJSONObject.Create;
  jsObjValues.Add('REAL', rValor);
  jsObjValues.Add('CURRENCY', cValor);
  jsObjValues.Add('SINGLE', sValor);
  jsObjValues.Add('DOUBLE', dValor);

  WriteLn(jsObjValues.FormatJSON());
  ReadLn();
end.

 

And the output:

 

{
  "REAL" : 1.2346,
  "CURRENCY" : 1.2346,
  "SINGLE" : 1.2346,
  "DOUBLE" : 1.2346
}

se possível em português, creio que seja daqui

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...