【问题标题】:Can printf() produce "-.5" for the value (-0.5)?printf() 可以为值(-0.5)生成“-.5”吗?
【发布时间】:2010-10-06 10:20:27
【问题描述】:

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

【问题讨论】:

  • @halfdan 你知道它可以在哪些地方吗? :)
  • @halfdan,我认为大多数实现 printf 的语言只是将它传递给 libc..?
  • 我很确定 Python 完全按照 @Amadan 所说的做......对于快速搞砸非常有用。

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


【解决方案1】:

对于 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);

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这将产生一个警告,因为“-.5”字符串中没有格式规范:)。我很欣赏一个笑话,但答案可能应该是社区 Wiki。
    【解决方案3】:

    一句话:没有……

    【讨论】:

    • 是的printf 可以。看我的回答。
    • @R..:不,它不能。请参阅我对您的回答的评论。
    【解决方案4】:

    是的。使用%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'));
    

    【讨论】:

    • 错了。 %g 被指定为 %f%e,具体取决于要打印的值,并且两者都指定在小数点前有一个数字。快速测试证实了这一点:printf( "%g", -0.5 ); 在我的机器(Linux)上产生“-0.5”。
    • 我的错。我正在阅读它作为删除尾随零的请求,而不是前导零。
    • 所有这些三振出局都让我流血了。
    【解决方案5】:

    然后将你的双精度或浮点数转换为字符:

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

    说明:

    1. while 循环确定字符何时结束。
    2. 如果双精度大于 1,则修剪没有意义。
    3. 如果不是一直检查“.”。
    4. 找到 1 后,往前走并删除 0。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 嗯? Downvote 将鼠标悬停在文本上:“这个答案没用”。这确实适用,因为您的回答不能解决 OP 的问题。 (不是 我的 否决票,但仍然 - 没有理由变得个人化。)
      • -1 在评论中完全是个混蛋;这里完全不合适。
      • 好的 - 我要删除我的帐户。
      猜你喜欢
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多