[英]padding in printf (float)
我想在模擬器的標題欄中顯示名稱、速度% 和幀速率,例如
<name> 100.00% 50.000fps
問題是, speed
通常略低於或略高於 100%,使其左右跳躍。
我知道我可以填充“零”
"%s at %05.2f%% speed, %05.3f fps"
但是前導零(如099.89%
)看起來真的很愚蠢。
此外,帶有空格的默認填充也無濟於事,因為顯然空格與數字的寬度不同,因此它也會跳躍。
這甚至可能(不使用某些固定(等寬)字體)嗎?
這甚至可能(不使用某些固定(等寬)字體)嗎?
嚴格來說,不,不是。 然而,雖然空格字符和數字之間的寬度差異通常相當大,但數字之間的寬度差異通常要小得多。
因此,您可以根據顯示的值的大小,通過更改小數位數 (DP) 來顯着減少“跳躍”:“100.0”為 1 個 DP,“42.42”為 2 個 DP,“42.42”為 3 個 DP對於小於 10 的值。使用 Stack Overflow (proportional) 字體,如下所示:
100.0
42.42
1.234
要在printf
function 中實現這一點,您可以使用固定寬度說明符,其精度取決於值的以 10 為底的對數,使用*
說明符將后者作為參數傳遞給printf
格式。
這是一個演示:
#include <stdio.h>
#include <math.h>
#define max(a,b) (((a) > (b)) ? (a) : (b))
int main()
{
double a = 112.345;
while (a > 0.0) {
printf("%5.*lf\n", max(0, 3 - (int)log10(max(1.0, a))), a);
a -= 12.345;
}
return 0;
}
Output:
112.3
100.0
87.66
75.31
62.97
50.62
38.28
25.93
13.59
1.240
正如評論中所指出的,上述解決方案在某些“邊緣情況”中會出現問題; 例如,當a = 99.999
時, log10
100.0
將返回1.9999996
左右的值,因此計算的 DP 數將為 2,但100.00
值將四舍五入為100
的 0.00 0.0.0。
解決此問題的方法是提供自定義ilog10
function,並使用它來確定 DP 的數量。 例如:
#include <stdio.h>
static inline int ilog10(double x)
{
int answer = 0;
x += 0.5;
while ((x /= 10) > 1.0 && answer < 3) ++answer;
return answer;
}
int main()
{
double a = 112.345;
while (a > 0.0) {
printf("%5.*lf\n", 3 - ilog10(a), a);
a -= 12.345;
}
return 0;
}
請注意,使用此自定義 function,我們可以省去<math.h>
header 和max
宏的定義/使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.