c - 将浮点数拆分为数字并转换为包括逗号在内的 ASCII
问题描述
我有一个 MCU,它向 LCD 发送一系列数字以显示。我需要发送他们的 ASCII 对应值才能使其正常工作。这些数字是浮点类型,小数部分的精度不超过 2 位。
问题是我需要一个函数来解析浮点数,获取其数字而不反转它们,将它们转换为 ASCII,并将逗号的 ASCII 代码放在数字中的位置。
例子:
数字 = 123.45
result = 49 50 51 44 52 53 //其中44是逗号的ASCII码
关于编写可以做到这一点的函数的任何建议?如果结果变量一次保留一个 ASCII 代码会很棒,因为我需要一次为每个符号调用 WriteToLCD 函数。
此外,我真的无法访问 sprintf、itoa、ftoa 等库函数。
一些代码示例:
void LCD_print(int number)
{
char aux;
int naux=0,maux=0;
while(number!=0)
{
maux=number%10;
naux=naux*10+maux;
number=number/10;
}
while(naux)
{
aux=naux%10+'0';
WriteToLCD(aux);
naux=naux/10;
}
}
我从互联网上的某个地方得到了这个函数,它在将整数转换为 ASCII 方面做得很好,但我需要将参数变成浮点数并将点的 ASCII 代码添加到结果中。
主要看起来像这样:
void main()
{
//other stuff
float number = ReadValueFromSensor();
LCD_print(number);
}
解决方案
需要一个函数来解析浮点数,获取其数字而不反转它们,将它们转换为 ASCII,并将逗号的 ASCII 代码放在数字中的位置。
将值缩放 100.0 以仅使用整数值并提供double
制造产品的额外精度。
使用类似整数的代码,其中首先使用 找到最低有效位fmod()
,然后是下一个最高位,依此类推。将结果保存在最坏情况大小的缓冲区中。
最后以相反的顺序打印。
NaN 和无穷大需要额外的代码。
#include <assert.h>
#include <float.h>
#include <stdio.h>
// - up to 38 digits . 00 \0
#define PRINT_FLT_SZ (1 + (FLT_MAX_10_EXP + 1) + 1 + 2 + 1)
void print_flt(float f) {
assert(isfinite(f));
double x = fabs(round(f * 100.0));
char buf[PRINT_FLT_SZ];
char *p = buf + sizeof buf - 1;
*p = '\0';
int digit_count = 0;
do {
double digit = fmod(x, 10.0);
x = (x - digit)/10;
*(--p) = (char)(digit + '0');
digit_count++;
if (digit_count == 2) {
*(--p) = '.';
}
} while (x || digit_count <= 2);
if (signbit(f)) {
*(--p) = ','; // or '.'
}
while (*p) {
// WriteToLCD(*p);
putchar(*p);
p++;
}
putchar('\n');
}
用法
int main() {
print_flt(123.45f); // OP's test
print_flt(123.459f); // round test
print_flt(-FLT_MAX); // range test
print_flt(0.00500001f); // round test
print_flt(-0.0); // signed zero test
//print_flt(-0.0/0.0); // TBD code for NaN and INF
}
输出
123,45
123.46
-340282346638528886604286022844204804240,00
0,01
-0,00
对于超过 10 14的值,可能会有一些额外的担忧,而x = (x - digit)/10;
不是需要更多的分析,但有一些东西可以让 OP 开始。
推荐阅读
- javascript - Javascript 从 mySQL 分隔符中删除格式
- python - 处理 JSON Twitter 数据
- ios - Firestore whereField( ,ArrayContainsAny: ) 弹出错误,指出它与可用的重载不匹配
- opengl - glGenerateMipmap 在特定平台上引发 GL_INVALID_OPERATION
- javascript - 如何将数组上的更改反映到我在 lit-element 中呈现的 html?
- html - 如何将标题项与 HTML 和 SCSS 对齐
- java - Maven 缺少工件但文件已就位 - Eclipse
- gremlin - Gremlin 控制台不断返回“与服务器的连接不再处于活动状态”错误
- javascript - 在本地运行网站并用 CDN 替换 jQuery
- node.js - 漏洞出现 npm install npm audit npm audit fix --force in windows 10 , npm 6.4.1 node v10.13.0