[牛人杂谈] 用String或sprintf( )与dtostrf( )做类似printf( )格式化输出

[复制链接]
 楼主| 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 | 显示全部楼层
格式化输出很好用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

1581

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部