在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'
答案 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): :
答案 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;
失败:
(奇怪的是:该版本表示“无可用更新”,并启动“检查更新”)
我没时间检查中间版本。
使用:
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.