printf()可以为值(-0.5)生成“-.5”吗?

时间:2010-10-06 10:20:27

标签: c floating-point double printf string-formatting

即。可以告诉printf在小数点之前忽略零吗?

6 个答案:

答案 0 :(得分:3)

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

  

f,F:[...]如果出现小数点字符,则至少会出现一个数字。 [...]

     

e,E:[...]在小数点字符[...]

之前有一位数(如果参数非零,则为非零)      

g,G:[...]转换为样式fe [...]

由于其他转换说明符不会打印十进制浮点数,因此根本不可能。除非您找到引入另一个转换说明符的供应商扩展。但是那时你的程序将不再是严格有效的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);

答案 1 :(得分:2)

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

printf("-.5", -0.5);

答案 2 :(得分:1)

总之:不......

答案 3 :(得分:0)

<击>是。使用%g格式说明符代替%f,即printf("%g", -0.5);

如果您对%g以指数表示法打印某些数字的方式不满意,可以选择使用snprintf写入临时字符串缓冲区,然后在用printf("%.*s", num_nonzero_places, tmp);写出之前计算结尾处的零数,或者你可以删除零并使用fputs

现在我意识到问题是关于删除前导零,而不是尾随零。在这种情况下,我知道的最好的方法是使用snprintf写入临时字符串,然后在写出该字符为“0”时跳过第一个字符。如果值为负,您还需要替换“ - ”符号。一种方法:

snprintf(tmp, sizeof tmp, "%+f", val);
printf("%.*s%s", tmp[0]=='-', tmp, tmp+1+(tmp[1]=='0'));

答案 4 :(得分:0)

将double或float转换为char:

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

Explination:

  1. while循环确定char结束的时间。
  2. 如果您所拥有的双倍大于1,则修剪没有任何意义。
  3. 如果没有继续检查“。”。
  4. 如果找到一个,请先删除零。

答案 5 :(得分:-3)

请参阅printf spec和精确部分。你可以printf("%+0.4f", -0.5);