簡體   English   中英

C printf 可選小數位

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM