2014-07-10 80 views
3

我想將一個數字轉換爲最多的字符串小數點右邊的15個數字。由最多我的意思是,如果最後幾位都是零,打印它們是沒用的。如何讓sprintf忽略尾隨零

例如:

sprintf('%.15f', 3.0001) 

==> '3.000100000000000' 

到目前爲止好,但這裏所有結尾數字都是零,我會者優先:

==> '3.0001' 

有沒有一種簡單的方法做到這一點的sprintf格式說明符或應該手動後處理輸出以刪除尾隨零?

注意:我正在與matlab一起工作,以防sprintf有其他替代方案。

回答

8

只需使用g代替f

sprintf('%.15g', 3.0001) 

ans = 

3.0001 

doc sprintf

  • %克%e或%的更緊湊的形式F沒有尾隨零

上述方法對於低於的數字將失敗0.0001(1E-4),在這種情況下的替代解決方案是使用%f和然後regexprep這裏它替代了一個更多個零,隨後用的空間的空間:

str = sprintf('%.15f ',mat); 
str = regexprep(str,'[0]+ ',' ') 

此方法也有數字低於5e-16的問題(例如小數點右側只有15位數的零),這些有效數字被刪除。

爲了代替解決這個盲目更換零,我們可以在後面的一個或多個零,然後與數字一個空格,然後通過一個空間範圍是1-9更換一個數字:

str = sprintf('%.15f ',mat); 
str=regexprep(str,'([1-9])[0]+ ','$1 ') 
3

做你是這個意思 ?

sprintf('%.15g', 3.0001001) 
==> 3.0001001 
sprintf('%.15g', 3.0001) 
==> 3.0001 
+0

是的,這就是我的意思,(我接受@RTL答案是一樣的)。謝謝。 – CitizenInsane

+0

其實我在1分鐘後回答,RTL值得。 :p 更好的是這個網站每月有兩個答案,而不是幾個月內沒有人回答! –