代码之家  ›  专栏  ›  技术社区  ›  sharkin

printf()能否为值(-0.5)生成“-.5”?

  •  5
  • sharkin  · 技术社区  · 14 年前

    即CAN printf 在小数点之前被告知忽略零?

    6 回复  |  直到 12 年前
        1
  •  3
  •   Roland Illig    14 年前

    对于ISO C99中规定的所有内容,这是不可能的。转换说明符的文档说明:

    f,f:[…]如果出现小数点字符,则在其前面至少出现一个数字。[…]

    e,e:[…]小数点字符[…]之前有一个数字(如果参数非零,则为非零)。

    G,G:[…]转换为样式 f e […]

    由于其他转换说明符不会打印十进制浮点数,因此这根本不可能。除非找到引入另一个转换说明符的供应商扩展。但是你的程序将不再是严格有效的C了。

    我想到的最佳解决方法是:

    double number = 0.5;
    char buf[80];
    char *number = buf;
    if (snprintf(buf, sizeof buf, "%f", number) <= 0)
      goto cannot_happen;
    
    while (*number == '0')
      number++;
    printf("%s\n", number);
    
        2
  •  2
  •   Erich Kitzmueller    14 年前

    当然可以,但恐怕你对我的回答不会太满意:

    printf("-.5", -0.5);
    
        3
  •  1
  •   DevSolar    14 年前

    总之:不……

        4
  •  0
  •   R.. GitHub STOP HELPING ICE    14 年前

    对。使用 %g 格式说明符而不是 %f ,即 printf("%g", -0.5);

    如果你对这条路不满意 %g 以指数表示法打印一些数字,另一种方法是使用 snprintf 写入临时字符串缓冲区,然后在写入前计算末尾的零数 printf("%.*s", num_nonzero_places, tmp); 或者你可以去掉零然后使用 fputs .

    现在我意识到问题是去掉前导零,而不是尾随零。在这种情况下,我知道最好的方法是 SNPrTNF 若要写入临时字符串,则在写入第一个字符时跳过该字符(如果该字符为“0”)。如果值为负数,也需要替换“-”号。一种方法是:

    snprintf(tmp, sizeof tmp, "%+f", val);
    printf("%.*s%s", tmp[0]=='-', tmp, tmp+1+(tmp[1]=='0'));
    
        5
  •  0
  •   thyrgle    14 年前

    将double或float转换为char,然后:

    while (*yourChar != '\0') {
        if (yourDoubleBeforeConversion > 1.0 && yourDoubleBeforeConversion < -1.0) {
            continue;
        }
        if(*yourChar == '.') {
            yourChar--;
            *yourChar = '';
        }
        else {
        }
    }
    

    说明:

    1. while循环确定字符结束的时间。
    2. 如果您拥有的双精度大于1,则没有修剪点。
    3. 如果它没有继续检查“.”。
    4. 当找到一个,在前面删除零。
        6
  •  -3
  •   Dead account    14 年前

    printf spec 以及精度部分。你可以做到 printf("%+0.4f", -0.5);