我有一个有限的80毫米打印机输出,我需要挤3位数的货币。 E.g。
2.345 -> 2.3
50.345 -> 50 or 50.
是否可以使用Format()/ FormatFloat?
我尝试了Format('%s%*f', [CurrencyString, 6 - Length(CurrencyString), Ratio])
,但它只是在分隔符后面加上2位小数。
在我的情况下,CurrencyString是三个字符长。
答案 0 :(得分:2)
可以使用Format()
中的宽度和精度说明符来限制输出。
uses
SysUtils,Math;
var
ratio : Currency;
s : String;
begin
ratio := 2.345;
s := Format('%3.*f',[Math.IfThen((ratio<9.95) and (ratio>=0),1,0),ratio]);
WriteLn(s);
ratio := 50.345;
s := Format('%3.*f',[Math.IfThen((ratio<9.95) and (ratio>=0),1,0),ratio]);
WriteLn(s);
end.
输出:
2.3
50
Math.IfThen()
是一个模仿if-then-else
表达式的函数。
答案 1 :(得分:0)
您可以遵循以下方法:
uses
SysUtils, Math;
function CurrencyTo80MM(const ACurrency: currency): string;
const
RoundFactor = 100; //As we have 2 significative decimal digits
var
Digits: integer;
begin
Digits := Length(IntToStr(Trunc(ACurrency)));
//Taking into account decimal point if it's the last char
if Digits = 2
then Inc(Digits);
Result := Copy(FormatFloat('#.00', RoundTo(ACurrency * RoundFactor, Digits - 1) / RoundFactor), 1, 3);
end;
解决方案的核心是使用RoundTo()和使用“超级采样”来解决舍入误差,并考虑整数部分长度来输出固定长度的结果。
使用值进行测试:
2.345 => 2.3
50.345 => 50.
50.9 => 51.
0.123 => .12
0.127 => .13
240.1 => 240
240.6 => 241
这个解决方案具有固定长度(总是3)和可见值最大化(省略初始零点)的优点。