打印
[牛人杂谈]

用String或sprintf( )与dtostrf( )做类似printf( )格式化输出

[复制链接]
1274|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
louliana|  楼主 | 2024-3-25 06:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 简单用法, 不注重格式, 只要有印出就好
要格式化输出,最简单的方法就是直接用 C++ 的 String( ) 串接功能即可:

int height=168;
float weight=72.5;
Serial.println(String("")+"Your Height="+height +   ", and Weight=" + weight);

说明: 只要第一个是 String(""), 之后不论整数 int, long, 实数 float 等都会自动转为字符串, 用 + 串接在一起 !
缺点: float 小数点后会印出几位无法控制 ,( 注意 UNO 如果用 double 其实会被偷改为 float )
2. 那如果是要印到 LCD 或 SoftwareSerial 软串口甚至 SPI 呢?
简单, 先放到 String 字符串即可, 之后爱怎样就怎样 :

int height=168;
float weight=72.5;
String gy = String("")+"Your Height="+height +  ", and Weight=" + weight;
Serial.println(gy);  // 印到串口
LCD.print(gy);  // 假设你已经有 LCD. 可以用

3. 如果实数float要印出小数点后两位呢?
只是看起来有点麻烦而已(其实你用 Serial.print(float) 它也是偷偷类似这样做 **注!):

int height=168;
float weight=72.5;
String gy = String("")+"Your Height="+height;
gy += ", and Weight=";
    // 开始处理 float weight 的值
long tmp = weight;   // 整数部分
long yytmp = (weight -tmp)*100+0.5;  //  小数部分; 从小数点后第三位做四舍五入(round)到第二位

/// if(yytmp >= 100) yytmp=99;  // 改用以下方法处理 ..
if(yytmp >= 100) {   // 防错
   yytmp=0;  
   ++tmp;  // 0.99xyz.. +0.005 ===>  1.0pqr...
} // it is 0.99xyz...
gy += tmp; // 整数部分
gy += ".";  // 小数点, 废话
if(yytmp < 10) gy += "0";
gy += yytmp;
Serial.println(gy);  // 印到串口
LCD.print(gy);  // 假设你已经有 LCD. 可以用

**注: 严格说来 Serial.print(float); 就是 Serial.print(float, 2);
这时它是用以下(5.)说的用AVR的 dtostrf( ) 函数把 float 转换为包括小数点后两位的字符串!

使用特权

评论回复
沙发
问天少年| | 2024-3-25 11:07 | 只看该作者
格式化输出很好用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

1312

帖子

1

粉丝