首页 > 解决方案 > 将浮点数拆分为数字并转换为包括逗号在内的 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);
}

标签: c

解决方案


需要一个函数来解析浮点数,获取其数字而不反转它们,将它们转换为 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 开始。


推荐阅读