8432|8

9716

帖子

24

TA的资源

版主

楼主
 

貌似超难的问题,C语言printf能否控制double输出的总长度 [复制链接]

感觉这是一个超难的问题,sprintf可能无法实现

比如想输出总长度为4位数字(不含小数点,但含负号),超出长度时舍掉小数
double=12.3456时输出12.34

double=123.45时输出123.4
double=-12.34时输出-12.3
double=-123.45时输出-123
此帖出自单片机论坛

最新回复

队长code贴的漂亮,赞赞赞  详情 回复 发表于 2017-9-1 09:40
点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 

回复
举报

3

帖子

2

TA的资源

一粒金砂(初级)

沙发
 
格式控制?有吧?
此帖出自单片机论坛
 
 

回复

120

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
本帖最后由 cj_in 于 2017-8-31 15:33 编辑

"%.5G"试试
http://www.runoob.com/cprogramming/c-function-printf.html
要不就snprintf


此帖出自单片机论坛

点评

试了没行,我还是用if判断吧  详情 回复 发表于 2017-8-31 18:07
 
 
 

回复

1403

帖子

1

TA的资源

纯净的硅(中级)

4
 
楼上方法比较接近了,再不满足就自己切字符串
此帖出自单片机论坛

点评

试了没行,只行用代码判断了  详情 回复 发表于 2017-8-31 18:07
 
个人签名HELLO_WATER
 
 

回复

9716

帖子

24

TA的资源

版主

5
 
cj_in 发表于 2017-8-31 15:32
"%.5G"试试
http://www.runoob.com/cprogramming/c-function-printf.html
要不就snprintf

试了没行,我还是用if判断吧
此帖出自单片机论坛
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

9716

帖子

24

TA的资源

版主

6
 
shinykongcn 发表于 2017-8-31 16:19
楼上方法比较接近了,再不满足就自己切字符串

试了没行,只行用代码判断了
此帖出自单片机论坛
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

6040

帖子

205

TA的资源

版主

7
 
确实比较难实现,只能想别的办法了


  1. #include <stdio.h>

  2. char * pre4d(char *num) {
  3.     int cnt = 0, i=0;
  4.     do {
  5.         if (num[i++] != '.') ++cnt;
  6.     } while(cnt < 4);
  7.     num[i] = '\0';
  8.     return num;
  9. }


  10. int main(int argc, const char * argv[]) {
  11.     // insert code here...
  12.     double a[5] = {0.1234, 1.2345, 12.345, 123.45, 12345.6};
  13.     char s1[6];
  14.     for(int i=0; i<5; i++) {
  15.         snprintf(s1, 6, "%f\n", a[i]);
  16.         printf("%s\n", pre4d(s1));
  17.         snprintf(s1, 6, "%f\n", -a[i]);
  18.         printf("%s\n", pre4d(s1));
  19.     }
  20.     return 0;
  21. }
复制代码

此帖出自单片机论坛

点评

队长code贴的漂亮,赞赞赞  详情 回复 发表于 2017-9-1 09:40
我后来是用if判断实现的 [mw_shl_code=c,true] if(d > 999 || d < -99) { sprintf((char*)buffer,"%.0f",d); } else if(d > 99 || d < -9) { sprintf((char*)buffer,"%.1  详情 回复 发表于 2017-9-1 09:05
 
 
 

回复

9716

帖子

24

TA的资源

版主

8
 
[quote]lcofjp 发表于 2017-8-31 23:12
确实比较难实现,只能想别的办法了


  1. #include

  2. char * pre4d(char *num) {
  3.    ...[/quote]
  4. 我后来是用if判断实现的

  5. [code]    if(d > 999 || d < -99)
  6.     {
  7.       sprintf((char*)buffer,"%.0f",d);
  8.     }
  9.     else if(d > 99 || d < -9)
  10.     {
  11.         sprintf((char*)buffer,"%.1f",d);
  12.     }
  13.     else
  14.     {
  15.       sprintf((char*)buffer,"%.2f",d);
  16.     }
复制代码


相比之下你这个代码更容易理解(取sprintf后的数据的前4位,不包括小数点)
还有一个也应该有的功能你的方法也能实现,比如保留整数的前4位,例如12345保留1234

感谢感谢
此帖出自单片机论坛
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

1403

帖子

1

TA的资源

纯净的硅(中级)

9
 
lcofjp 发表于 2017-8-31 23:12
确实比较难实现,只能想别的办法了

[code]
#include

char * pre4d(char *num) {
   ...

队长code贴的漂亮,赞赞赞
此帖出自单片机论坛
 
个人签名HELLO_WATER
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表