即。可以告诉printf
在小数点之前忽略零吗?
答案 0 :(得分:3)
使用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);
答案 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:
答案 5 :(得分:-3)
请参阅printf spec和精确部分。你可以printf("%+0.4f", -0.5);