DBGrid中的千位分隔符

时间:2014-02-04 10:20:50

标签: mysql delphi sum separator fastreport

我使用MySQL和Delphi XE4构建应用程序。 数据库中有大数字,我在查询中使用FORMAT函数来应用千位分隔符!

SELECT Field1,FORMAT((Field2 * Coef), 0) AS blabla FROM MyTable WHERE .....

一切都很好但是当我尝试在FastReprot中添加SUM函数时,会发生逻辑错误!

FORMAT函数以字符串形式返回结果,SUM函数连接字符串!!!

SUM(frxDBDataset1."blabla",MasterData1)

Product1| 123,500,000
Product2| 1,455,999,100
________________________________
SUM = 123,500,000-1,455,999,100

在DBGrid中显示千位分隔符的最佳方法是什么! 我正考虑在" OnGetText"中使用千位分隔符。事件。当recordcount> 5000?

时,此方法是否会导致在DBGrid中显示数据的延迟

你有什么建议吗?

2 个答案:

答案 0 :(得分:3)

在查询中格式化结果真的是个坏主意。该查询应该用于检索信息......演示应该在别处处理。在这种情况下,我会使用(我确实使用)DisplayFormat,如评论中所建议的那样。

如果您不想总是在设计时将字段添加到TDataSet,您也可以编写一些自动格式化的代码:

DataSet.Open;
For I := 0 To DataSet.Fields.Count - 1 Do Begin
    If DataSet.Fields[I] Is TFloatField Then
        (DataSet.Fields[I] As TNumericField).DisplayFormat := '###,###,##0.00'
    Else If DataSet.Fields[I] Is TIntegerField Then
        (DataSet.Fields[I] As TNumericField).DisplayFormat := '###,###,##0';
End;

这应该根据您的实际需要进行调整......例如,您可以从BD读取元数据(这取决于BD)以决定精度。

在FastReport内部,您也可以使用DisplayFormat,或者也可以在备忘录中使用格式函数:[Format('%.2n', [<DataSet."Field">])],其中.2表示要使用的精度。

编辑:要解决右侧出现的带有BiDiMode = bdRightToLeft的减号问题(请参阅this),我相信您确实需要使用OnGetText事件。我想你已经自己找到了这个解决方法,但是为了完整性我还是把它包括在内:

procedure TForm1.FieldGetText(Sender: TField; var Text: String; DisplayText: Boolean);
var
  FmtStr: string;
  F: Double;
begin
  F := Sender.AsFloat;
  FmtStr := TNumericField(Sender).DisplayFormat;
  if Sign(F) = -1 then
    Text := '-' + FormatFloat(FmtStr, Abs(F))
  else
    Text := FormatFloat(FmtStr, F)
end;

答案 1 :(得分:1)

稍作改动,效果很好。 [文字:= FormatFloat(FmtStr,-F)+' - '; ]

特别感谢GabrielF。

procedure TForm1.FieldGetText(Sender: TField; var Text: String; DisplayText: Boolean);
var
  FmtStr: string;
  F: Double;
begin
  F := Sender.AsFloat;
  FmtStr := TNumericField(Sender).DisplayFormat;
  if F < 0 then
    Text := FormatFloat(FmtStr, -F) + '-';
  else
    Text := FormatFloat(FmtStr, F)
end;