[英]C printf optional decimal places
在 C# 我可以執行以下操作:
Console.Write("{0}, ", string.Format("{0:0.00###########}", someFloatValue));
為某些任意浮點值獲取至少 2 位小數,最多為某些可選小數位,在本例中為 13。
我想知道 C 中的 printf 是否也可以這樣做?
去掉尾隨的零位。
void formatDouble(char* buf, double val, int precMin, int precMax) {
int length = sprintf(buf, "%.*f", precMax, val);
if (isfinite(val) && length > 0) {
for (int i = precMax; i > precMin; i--) {
if (buf[length - 1] == '0') {
buf[--length] = '\0';
} else {
break;
}
}
}
}
void fooo(double d) {
char buf[100];
formatDouble(buf, d, 2,6);
printf("<%s>\n", buf);
}
int main(void) {
fooo(0.1234567890);
fooo(0.123450);
fooo(0.12300);
}
Output
<0.123457>
<0.12345>
<0.123>
感謝您提供一些指導的鏈接。 這是我想出的讓您指定最小和最大精度的方法,因此它的行為更像 C# function,以及對最后一位數字進行舍入。 讓我知道是否應該進行一些優化或更改。
void formatDouble(char* buf, double val, int precMin, int precMax) {
sprintf(buf, "%.*f", precMax, val);
int startpos = 0;
int length = strlen(buf);
bool found = false;
for (int z = 0; z < length; z++)
{
if (buf[z] == '.')
{
startpos = z;
found = true;
break;
}
}
if (!found)
return;
int endIndex = startpos + precMin;
found = false;
for (int z = precMax + startpos; z >= startpos + precMin; z--)
{
if (buf[z] >= '1' && buf[z] <= '9')
{
endIndex = z;
if (endIndex < startpos + precMax)
{
// Round Digit
if (buf[z + 1] >= '5')
buf[z]++;
}
found = true;
break;
}
}
for (int z = endIndex + 1; z <= length; z++)
{
if (z <= startpos + precMax)
buf[z] = 0;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.