格式化double,printf中至少有一个小数

时间:2016-06-03 09:37:19

标签: c json formatting printf

要为具有最大精度但没有尾随零的JSON格式化双精度,我们使用%.15g。但是,为了区分整数和实数,我们希望用至少一个数字格式化双精度数,即"%.1f",但科学记数法中的数字除外(根据定义,它们是双精度数)。

有没有办法在单个snprint format中实现此功能?

double val;
char buf[32];

if(fabs(val) < 1e15 && !fmod(val, 1)){
  // whole numbers get at least one decimal
  snprintf(buf, 32, "%.1f", val);
} else {
  // automatically detemines decimal or scientific notation
  snprintf(buf, 32, "%.15g", val);
}

1 个答案:

答案 0 :(得分:0)

只需使用转化说明符g,并在字符串末尾添加.0,如果字符串只包含符号和数字字符。 yajl库有example implementation

char buf[32];
sprintf(buf, "%.20g", val);
if (strspn(buf, "0123456789-") == strlen(buf)) {
  strcat(buf, ".0");
}