Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 格式(';%7.8f';,[varFloat])仅格式化小数_Delphi_String Formatting - Fatal编程技术网

Delphi 格式(';%7.8f';,[varFloat])仅格式化小数

Delphi 格式(';%7.8f';,[varFloat])仅格式化小数,delphi,string-formatting,Delphi,String Formatting,格式('%7.8f',[varFloat])仅格式化小数 例如,13,98变为1398000000。 我必须使用的是: 0000001398000000 我知道这是一个枯燥的问题,但我的时间很短,我找不到为什么没有按我所希望的那样工作。如果您准备进入system C运行时,可以使用sprintf。例如: {$APPTYPE CONSOLE} function sprintf(buf: Pointer; format: PAnsiChar): Integer; cdecl; varargs

格式('%7.8f',[varFloat])仅格式化小数

例如,13,98变为1398000000。 我必须使用的是: 0000001398000000


我知道这是一个枯燥的问题,但我的时间很短,我找不到为什么没有按我所希望的那样工作。

如果您准备进入system C运行时,可以使用
sprintf
。例如:

{$APPTYPE CONSOLE}

function sprintf(buf: Pointer; format: PAnsiChar): Integer; cdecl; 
  varargs; external 'msvcrt.dll';

var
  buf: array [0..255] of AnsiChar;
  val: Double;

begin
  val := 13.98;
  sprintf(@buf, '%015.8f', val);
  Writeln(buf);
  Readln;
end.
这将产生:

000013.98000000 13.98000000 您可能会考虑选择一种防止缓冲区溢出的变体


但是会更容易。

如果您准备进入system C运行时,您可以使用
sprintf
。例如:

{$APPTYPE CONSOLE}

function sprintf(buf: Pointer; format: PAnsiChar): Integer; cdecl; 
  varargs; external 'msvcrt.dll';

var
  buf: array [0..255] of AnsiChar;
  val: Double;

begin
  val := 13.98;
  sprintf(@buf, '%015.8f', val);
  Writeln(buf);
  Readln;
end.
这将产生:

000013.98000000 13.98000000 您可能会考虑选择一种防止缓冲区溢出的变体


但是会更容易。

当Pos(','string)9在字符串前面加上'0'时,如果正数为空,您想要18个位置吗?您的问题并不完全清楚。您期望的输出是什么?您想要整个部分的前导零,还是不想要小数点后的多余零?
FormatFloat('0000000.00000000',13.98))
@user246408,这应该是答案!当Pos(','string)9在字符串“0”前加上前缀时,如果是正数,则需要18个位置,其中第一个位置为空?您的问题并不完全清楚。您期望的输出是什么?您想要整个部分的前导零,还是不想要小数点后的多余零?
FormatFloat('0000000.00000000',13.98))
@user246408,这应该是答案@Vladds如果您根据
FormatFloat()
编写一个答案并接受它,那会更好。这个答案是古董。FWIW,我最近使用了Delphi中的sprintf来避免IntToStr无法避免的堆分配。得知Delphi RTL无法使用调用方提供的缓冲区将int转换为string,我很难过一个循环(n)到10.000.000,带有
Str(n,aShortString)vs
sprintf(@buf,'%d',n)在x32模式下给出437对2224毫秒。@最后,我使用Str使用的相同DivMod方法推出了自己的LURD。因此,我今天提出问题。我自己这样做是为了避免使用短字符串。做了很多单元测试。一些有趣的角落案例。特别是abs(val),其中val为低(整数)且溢出/范围检查处于活动状态。能够根据IntToStr测试所有32位值。64位整数不可能。谢谢你的想法@Vladds如果您根据
FormatFloat()
编写一个答案并接受它,那会更好。这个答案是古董。FWIW,我最近使用了Delphi中的sprintf来避免IntToStr无法避免的堆分配。得知Delphi RTL无法使用调用方提供的缓冲区将int转换为string,我很难过一个循环(n)到10.000.000,带有
Str(n,aShortString)vs
sprintf(@buf,'%d',n)在x32模式下给出437对2224毫秒。@最后,我使用Str使用的相同DivMod方法推出了自己的LURD。因此,我今天提出问题。我自己这样做是为了避免使用短字符串。做了很多单元测试。一些有趣的角落案例。特别是abs(val),其中val为低(整数)且溢出/范围检查处于活动状态。能够根据IntToStr测试所有32位值。64位整数不可能。谢谢你的想法!!