首页 > 解决方案 > 当值为整数时,不能将小数部分显示为 .0

问题描述

情况如下:

uses
  System.JSON;
     
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  dd:Double;
  aJsonObj:TJSONObject;
begin
  dd := 100.0;
  aJsonObj := TJSONObject.Create(TJSONPair.Create('DecimalValue',TJSONNumber.Create(dd)));
  ShowMessage(aJsonObj.ToString);
end;

这表明

{"DecimalValue":100}

我需要的是

{"DecimalValue":100.0}

我试图改变JsonFormatSettings,但我找不到添加小数部分的方法。

标签: jsondelphi

解决方案


其中一个TJSONNumber构造函数接受一个原始字符串值,该值将在生成的 JSON 字符串中使用,无需进一步处理。它允许您自己预先格式化值:

procedure TForm1.Button1Click(Sender: TObject);
var
  dd: Double;
  aJsonObj: TJSONObject;
begin
  dd := 100.0;
  aJsonObj := TJSONObject.Create(
    TJSONPair.Create('DecimalValue', TJSONNumber.Create(FormatFloat('0.0###', dd, GetJSONFormat))));
  try
    ShowMessage(aJsonObj.ToString);
  finally
    aJsonObj.Free;
  end;
end;

使用上面的代码片段,值显示为:

{"DecimalValue":100.0}

您甚至可以创建'whatever'为数字:

aJsonObj := TJSONObject.Create(TJSONPair.Create('DecimalValue', TJSONNumber.Create('whatever')));

得到这个(无效的)JSON:

{"DecimalValue":whatever}

旁注:您负责释放您创建的根 JSON 对象,因为它们没有父对象来管理其生命周期。如您在第一个代码片段中所见,使用完根对象后使用try..finally它。Free太糟糕了,文档本身会诱使您不进行清理。


推荐阅读