如何修改format的%f小數位設定 |
缺席
|
freyasawo
一般會員 發表:5 回覆:6 積分:2 註冊:2008-05-06 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
max5020
資深會員 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
|
freyasawo
一般會員 發表:5 回覆:6 積分:2 註冊:2008-05-06 發送簡訊給我 |
===================引 用 max5020 文 章=================== TestStr := Format(5459.4, '#######0.0000') ================ 不好意思,我可能不是講得很清楚 寫法大略如下: TString.Insert(iIndex, format('%f^^%.4f', [ 12.999, 10.991 ])); 紅色 是我改寫的,這樣的話他就會擷取小數四位 但像%f話的,他的浮點數運算會擷取兩位數字,超過小數兩位會四捨五入自動進位 到時我擷取 stringlist的值,他會顯示『13^^10.9910』 可是我的值明明就是12.999 ,換成13的話並不是我要的 由於這種%f寫法是前人寫的,超多的地方運到到,我要用%.4f的寫法,要改相當多的地方 因此才會想說從根本去解決 直接讓 %f 擷取小數四位 所以我才會去找uses SysUtils 想找說浮點數的運算位 是在哪裡才可做更動 不好意思,因為我實在是找不到,可不可以有人提點我尋找的方向 我想我找去 procedure FmtStr(var Result: string; const Format: string; const Args: array of const); 是不是找錯了
編輯記錄
freyasawo 重新編輯於 2008-05-14 11:15:00, 註解 無‧
|
shunaaron
高階會員 發表:13 回覆:94 積分:106 註冊:2006-10-06 發送簡訊給我 |
Format格式化字元串必須以%開頭 (2) [index ":"] ,那麼'a'的索引就是0,而'c'的索引就是1,而且由於只有 Format('%2:s %1:s %0:s', ['1st', '2nd', '3rd']); 這個標識符的作用是當要顯示的字符的個數少於[width]時,在右邊填補空格; Format('(%4s)', ['aa']); '寬度 寬度來顯示;反之,則填補空格或按要求填補其它字符。 (5) ["." prec] 這是針對浮點數來說的,一般就是指小數點後的位數。 (6) type type有符號十進製數 必須是有符號整型數。如果在格式化字元串中還加入了["." prec],則如果Args 結果︰'(099)' 無符號十進製數 Args (3) e 用科學技術法顯示數據,形式大致如下︰'-d.ddd...E ddd'。 Args總是顯示一位數字;包括小數點前面的數字在內,數字的個數由["." prec]來確定, ,則剛剛超出的那一位數字四舍五入。指數符號E後面總是要跟著加號或 (4) f 必須為浮點數,轉換後的形式大致是'-ddd.ddd...'這樣的。 由["." prec]決定。如果沒有指定["." prec],預設為2位精度。 一般的 Args被轉換後的數字總是儘可能的簡短(有可能是f或e形式的)。有重要意義的數字的長度 小數點也只有在必要的時候才顯示出來。如果小數點左邊的數字小於等於指定的精度, (6) n Args (7) m 必須是浮點數。能夠顯示貨幣符號,可以透過“控制面板”來設定。小數點後 (8) p 必須是一個指標值。 字元串必須是字符,字元串或PChar值。 精度指定數量的字元串,其餘的刪除。 十六進製 Args如果使用了" prec] 等價於︰Format('% ===================引 用 freyasawo 文 章=================== ===================引 用 max5020 文 章=================== TestStr := Format(5459.4, '#######0.0000') ================ 不好意思,我可能不是講得很清楚 寫法大略如下: TString.Insert(iIndex, format('%f^^%.4f', [ 12.999, 10.991 ])); 紅色 是我改寫的,這樣的話他就會擷取小數四位 但像%f話的,他的浮點數運算會擷取兩位數字,超過小數兩位會四捨五入自動進位 到時我擷取 stringlist的值,他會顯示『13^^10.9910』 可是我的值明明就是12.999 ,換成13的話並不是我要的 由於這種%f寫法是前人寫的,超多的地方運到到,我要用%.4f的寫法,要改相當多的地方 因此才會想說從根本去解決 直接讓 %f 擷取小數四位 所以我才會去找uses SysUtils 想找說浮點數的運算位 是在哪裡才可做更動 不好意思,因為我實在是找不到,可不可以有人提點我尋找的方向 我想我找去 procedure FmtStr(var Result: string; const Format: string; const Args: array of const); 是不是找錯了
------
程式沒有這麼難 只是還沒打通其中要絕 |
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
建議您:
寫程式,把source.pas一行一行讀入 判斷 %f 的地方 改成 %.4f PS: 先搜尋source是否有出現%.4f字串更佳 ===================引 用 freyasawo 文 章=================== 因為format的%f值代入為浮點數,如12代入會成12.00,13.111會變成13.11 那麼有辦法去程式做改變讓他%f固定取值為小數4位嗎? 就不需要再改寫成%.4f 不好意思,我找過程式碼,但找到後來實在是頭大,看不懂 我找到uses SysUtils procedure FmtStr(var Result: string; const Format: string; const Args: array of const); 接下來的FormatBuf 就看不懂了…
------
What do we live for if not to make life less difficult for each other? |
freyasawo
一般會員 發表:5 回覆:6 積分:2 註冊:2008-05-06 發送簡訊給我 |
不好意思這問題拖很久沒結案
後來找了個看得懂組合語言的工程師 解決了我的疑問 還是一樣 我需要的%f 他的預設是取小數兩位 ,但我要把他改成預設取小數四位 所以在uses SysUtils 裡面的 FormatBuf <註:function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const): Cardinal;> 裡的內容 因為%f會跑下面這段 MOV BL,ffFixed CMP CL,'F' JE @G1 所以到這裡修改 把2改成4 @G1: MOV EAX,18 MOV EDX,Prec CMP EDX,EAX JBE @G3 MOV EDX,4 但單純的修改是沒用的,他用到一個物件為{$L FFMT.OBJ} 還需要去borland下載FFmt.OBJ 然後我把修改好的SysUtils.pas 、SysUtils.dcu及FFmt.OBJ 放到我Delphi開啟→Tools→Environment Options→Library頁韱→Library Path 再預設一個資料夾路徑把那三個檔丟進去,把他移到第一順位執行 這樣我的%f就是預設小數點4位了 也謝謝大家的幫忙 ^^ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |