【问题标题】:C printf() formatting: Float doesn't seem to right justify.C printf() 格式:浮点数似乎不能正确证明。
【发布时间】:2015-12-10 14:44:24
【问题描述】:

当我尝试格式化此输出时发生了一些奇怪的事情,看起来浮点数不正确?

我想让小数点对齐...我做错了吗?

if (flushParams -> Volume > 0)
{   
    printf("\n      %-23s %7ld %2s  %7ld %3s  %2s %4.1f %1s  %9s %4.1f %2s %9s %4.1f %2s",
           "Intake Flush",
           event_data -> water1.ml, "ml",
           event_data -> water1.secs, "sec",
           "LB", event_data -> water1.bat, "V",
           "Average I", event_data -> water1.average_current, "mA",
           "Highest I", event_data -> water1.highest_current,  "mA");
    Message(event_data -> water1.message);
    printf("\n      %-11s = %02d", "Flush port", event_data -> portwater);
}
printf("\n\n      %-23s %7ld %2s  %7ld %3s  %2s %4.1f %1s  %9s %4.1f %2s %9s %4.1f %2s",
       "Sample",
       event_data -> sample.ml, "ml",
       event_data -> sample.secs, "sec",
       "LB", event_data -> sample.bat, "V",
       "Average I", event_data -> sample.average_current, "mA",
       "Highest I", event_data -> sample.highest_current,  "mA"); 
Message(event_data -> sample.message);
printf("\n      %-11s = %02d", "Sample port", event_data -> portsample);
printf("\n      ");
print_datetime(event_data -> time_off);
printf("  %3.1f Vbat  %3.1f %cC  PORT = %02d", 
       event_data -> vbat_off, event_data -> celcius_off, 248, event_data -> portend);

printf("\n");

输出如下所示:

  Intake Flush                101 ml       34 sec  LB 22.5 V  Average I 113.0 mA Highest I 118.0 mA Volume reached
  Flush port  = 00

  Sample                      320 ml      141 sec  LB 22.5 V  Average I 91.0 mA Highest I 97.0 mA Volume reached
  Sample port = 01
  12/09/15 17:11:14  22.6 Vbat  22.5 øC  PORT = 01

注意到“平均 I”和“最高 I”值没有对齐吗?默认情况下,它们不应该是正确的吗?我希望浮点数的最后显示数字将位于我为浮点数指定的 4 个字符空间中的最右侧位置。多头正按我预期的方式显示。

【问题讨论】:

  • "%4.1f" 中 4 的宽度是输出的最小文本宽度。它包括符号、前导空格、(如果有指数,则为指数)以及数字。
  • 请查看如何创建 MCVE (How to create a Minimal, Complete, and Verifiable Example?) 或 SSCCE (Short, Self-Contained, Correct Example) — 两个名称和链接用于相同的基本思想。此代码比 MCVE 复杂得多。有很多无关的材料需要处理,我们真的不应该处理。
  • 谢谢大家...这就是问题所在,我会给你们所有人投票,但我还没有这样做的特权。另外,我很抱歉为这样一个简单的问题发布了这么多代码。从现在开始,我的示例将包含最少的代码来呈现我遇到的问题。

标签: c formatting printf


【解决方案1】:

对于您的数据,将 %4.1f 更改为 %5.1f 将解决此问题。在 %m.nf 格式说明符中,m 是字段的总宽度(以字节为单位),而不是小数点前的位数。

【讨论】:

  • 如果有负值,符号也会被计入计数;计算小数点。它是最小总宽度;当需要更大的宽度时,会使用更大的宽度——正如问题中的样本数据所证明的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2015-10-16
  • 2017-09-30
  • 2018-06-04
  • 2014-07-16
  • 2011-08-01
  • 2011-05-14
相关资源
最近更新 更多