![](/img/trans.png)
[英]How to format number with “.” as thousand separator, and “,” as decimal separator?
[英]Thousand Separator in DBGrid
我正在使用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中顯示數據的延遲?
你有什么建議嗎?
在查詢中格式化結果的格式確實是一個壞主意。 該查詢應用於檢索信息...表示應在其他地方處理。 在這種情況下,我將按照注釋中的建議使用(實際上,我確實使用了)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函數: [Format('%.2n', [<DataSet."Field">])]
,其中.2
表示使用。
編輯:為了解決出現在與右側的減號的問題BiDiMode = bdRightToLeft
(見本 ),我相信你會真正需要使用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;
稍作更改,效果很好。 [ 文本:= 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.