真不敢相信我为这件事做了这么多的努力!希望这是一件容易的事。使用Delphi或Freepascal:
给定整个整数值"1230“或"1850",如何将其格式化为浮点数字符串,其中小数点位于第三个位置,尾数被丢弃。
示例
1230意为"v12.3“1850指"v18.5”
所以我需要把前两个数字转换成一个字符串。然后插入小数位。将第三个数字转换为十进制之后的字符串。并丢弃零。我看过Format、FormatFloat、Format和其他几种格式,它们似乎都等同于将现有的浮点数字转换为字符串,或者将浮点字符串转换为数字。
发布于 2019-11-26 14:11:02
只需将整数值赋值给浮点数并除以100.0。
使用格式()或FormatFloat()将值转换为具有三位数和小数点的字符串:
program Project8;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
var
i : Integer;
const
myFormat : TFormatSettings = (DecimalSeparator: '.');
begin
i := 1230;
WriteLn(Format('v%4.1f',[i/100.0],myFormat)); // Writes v12.3
WriteLn(FormatFloat('v##.#',i/100.0,myFormat)); // Writes v12.3
ReadLn;
end.发布于 2019-11-26 14:18:51
当整数算法能够完成这项工作时,我个人并不太在意使用浮点算法(在其他答案中用10种方法除以)。您正在将数字转换为不完美的表示,然后舍入到小数点后的一位。这些解决方案将有效,因为您可以对表示的不精确性进行足够的限制。但是,当算法可以精确地使用整数操作时,为什么还要启动浮点单元呢?
所以我总是会在这些线路上选择一些东西。
Major := Version div 100;
Minor := (Version mod 100) div 10;其中Version是您的输入值。然后,可以将其转换为如下所示的字符串:
VersionText := Format('%d.%d', [Major, Minor]);您甚至可以在不使用任何显式算术的情况下进行转换:
VersionText := IntToStr(Version);
N := Length(VersionText);
VersionText[N] := VersionText[N-1];
VersionText[N-1] := '.';发布于 2019-11-26 14:04:39
我不确定是否有更干净或更好的方法,但我的建议是将复制与IntToStr结合使用。
var
number,version:string;
begin
number = IntToStr(1850);
version = 'V'+copy(number,1,2)+'.'+copy(number,3,1);
end;您可以根据输入值添加number字符串长度的检查。
https://stackoverflow.com/questions/59052443
复制相似问题