使用货币数据类型时,Delphi XE2中的奇怪格式结果

时间:2013-04-16 20:55:03

标签: delphi delphi-xe2

在Delphi XE2中,我在格式化Currency时遇到了奇怪的格式差异。使用Double按预期工作。

看起来当使用%F%N(浮点或数字)时,即使您请求的数量较少,也总是会得到3位小数。

  • 使用格式'%.1f'Double 3.1415的值将变为'3.1',但Currency的{​​{1}}值将变为{{1} (假设是en-US语言环境)。
  • 使用格式3.1415'3.142' '%4.0n'的值将变为Double,但3.1415的{​​{1}}值将变为{{1} (假设是en-US语言环境)。

我写了下面的快速DUnit测试用例,明天将进一步调查。

除了Delphi XE2之外,这个特殊的项目不能改变(大企业在他们使用的工具上不灵活),所以我正在寻找一种解决方案,在Delphi XE2中解决这个问题。

同时:你的想法是什么?

'   3'

2 个答案:

答案 0 :(得分:1)

在上述问题的评论中,根据提问者的要求发布此答案。)

我无法使用普通的控制台应用程序在XE2或XE3上重现该问题。 (为我设置的速度更快。)

这是我在其中使用的代码完全(在XE2 / XE3上):

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils;

const
  DoublePi: Double = 3.1415;
  CurrencyPi: Currency = 3.1415;
  FloatFormat = '%.1f';
  NumericFormat = '%4.0n';
begin
  WriteLn(Format('Double   (.1f) : '#9 + FloatFormat, [DoublePi]));
  WriteLn(Format('Currency (.1f) : '#9 + FloatFormat, [CurrencyPi]));
  WriteLn(Format('Currency (4.0n): '#9 + NumericFormat, [CurrencyPi]));
  ReadLn;
end.

这是XE2运行的输出(Delphi®XE2版本16.0.4429.46931): :

Format Currency Console App Output

答案 1 :(得分:0)

这是早期Delphi XE 2版本在这些方法中的一个错误:

function WideFormatBuf(var Buffer; BufLen: Cardinal; const Format;
  FmtLen: Cardinal; const Args: array of const;
  const AFormatSettings: TFormatSettings): Cardinal;

function FormatBuf(var Buffer; BufLen: Cardinal; const Format;
  FmtLen: Cardinal; const Args: array of const;
  const AFormatSettings: TFormatSettings): Cardinal;

失败:

  • Embarcadero®RADStudio XE2版本16.0.4256.43595(更新2)

(奇怪的是:该版本表示“无可用更新”,并启动“检查更新”)

我没时间检查中间版本。

使用:

  • Embarcadero®RADStudio XE2版本16.0.4429.46931(更新4))
  • Embarcadero®Delphi®XE2版本16.0.4504.48759(更新4修补程序1)

XE2 Update 4(有或没有修补程序)中断的一个原因是创建了一个标准(非IntraWeb)单元测试项目。

缺少此菜单条目:File -> New -> Other -> Unit Test -> Test Project

作为对我自己的提醒,这是快速开始使用缺少的测试项目条目的骨架代码:

program UnitTest1;
{

  Delphi DUnit Test Project
  -------------------------
  This project contains the DUnit test framework and the GUI/Console test runners.
  Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options
  to use the console test runner.  Otherwise the GUI test runner will be used by
  default.

}

{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
  Forms,
  TestFramework,
  GUITestRunner,
  TextTestRunner;

{$R *.RES}

begin
  Application.Initialize;
  if IsConsole then
    with TextTestRunner.RunRegisteredTests do
      Free
  else
    GUITestRunner.RunRegisteredTests;
end.