全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:10992
推到 Plurk!
推到 Facebook!

如何修改format的%f小數位設定

缺席
freyasawo
一般會員


發表:5
回覆:6
積分:2
註冊:2008-05-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-06 14:40:14 IP:61.221.xxx.xxx 訂閱
因為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 就看不懂了…
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-06 20:25:27 IP:61.67.xxx.xxx 未訂閱
請你搜尋 format 用法
max5020
資深會員


發表:29
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-05-07 20:11:32 IP:59.120.xxx.xxx 訂閱
TestStr := Format(5459.4, '#######0.0000')
編輯記錄
max5020 重新編輯於 2008-05-07 20:11:52, 註解 無‧
freyasawo
一般會員


發表:5
回覆:6
積分:2
註冊:2008-05-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-05-14 11:10:59 IP:61.221.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-05-15 17:41:40 IP:220.128.xxx.xxx 訂閱

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被轉換後的數字總是儘可能的簡短(有可能是fe形式的)。有重要意義的數字的長度
小數點也只有在必要的時候才顯示出來。如果小數點左邊的數字小於等於指定的精度,

(6) n Args
(7) m 必須是浮點數。能夠顯示貨幣符號,可以透過“控制面板”來設定。小數點後

(8) p 必須是一個指標值。

字元串必須是字符,字元串或PChar值。
精度指定數量的字元串,其餘的刪除。
十六進製

Args如果使用了" prec]
等價於︰Format('%8.2f', [123.456]).

===================引 用 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-05-16 16:49:22 IP:203.73.xxx.xxx 未訂閱
建議您:
寫程式,把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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-06-17 14:16:41 IP:85.25.xxx.xxx 訂閱
不好意思這問題拖很久沒結案

後來找了個看得懂組合語言的工程師 解決了我的疑問
還是一樣 我需要的%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位了
也謝謝大家的幫忙 ^^
系統時間:2024-04-27 2:35:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!