限制格式()中的总货币数字

时间:2018-04-19 09:23:02

标签: delphi

我有一个有限的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是三个字符长。

2 个答案:

答案 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)和可见值最大化(省略初始零点)的优点。