7224|8

9714

帖子

21

资源

版主

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

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

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

double=123.45时输出123.4
double=-12.34时输出-12.3
double=-123.45时输出-123
此帖出自单片机论坛
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复

3

帖子

2

资源

一粒金砂(初级)

格式控制?有吧?

回复

120

帖子

0

资源

一粒金砂(中级)

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

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


点评

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

回复

1455

帖子

1

资源

纯净的硅(中级)

楼上方法比较接近了,再不满足就自己切字符串

点评

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

回复

9714

帖子

21

资源

版主

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

试了没行,我还是用if判断吧
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复

9714

帖子

21

资源

版主

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

试了没行,只行用代码判断了
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复

6074

帖子

206

资源

版主

确实比较难实现,只能想别的办法了 1111.png
2222.png

  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
个人签名

EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,上班摸鱼场,释放压力好地方!商家勿入!加群暗号:喵


回复

9714

帖子

21

资源

版主

[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

感谢感谢
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复

1455

帖子

1

资源

纯净的硅(中级)

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

[code]
#include

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

队长code贴的漂亮,赞赞赞
个人签名HELLO_WATER

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

查找数据手册?

EEWorld Datasheet 技术支持

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

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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