定点十进制printf输出

时间:2016-10-01 18:05:21

标签: c embedded fixed point

我的液晶显示器在我的TM4C123上运行,我的printf工作正常。

我正在尝试使左列的输入看起来像右列的输出。

我尝试的是从整数中提取每个数字,然后打印出每个数字,然后将小数点放在那里。当我提取数字时,符号似乎坚持数字,我似乎无法正确格式化。

outTestCaseType1 outTests1[13]={ 
{     0,  " =  0.000?\r" }, //     0/1000 = 0.000  
{     4,  " =  0.004?\r" }, //     4/1000 = 0.004  
{    -5,  " = -0.005?\r" }, //    -5/1000 = -0.005
{    78,  " =  0.078?\r" }, //    78/1000 = 0.078
{  -254,  " = -0.254?\r" }, //  -254/1000 = -0.254
{   999,  " =  0.999?\r" }, //   999/1000 = 0.999
{ -1000,  " = -1.000?\r" }, // -1000/1000 = -1.000
{  1234,  " =  1.234?\r" }, //  1234/1000 = 1.234
{ -5678,  " = -5.678?\r" }, // -5678/1000 = -5.678
{ -9999,  " = -9.999?\r" }, // -9999/1000 = -9.999
{  9999,  " =  9.999?\r" }, //  9999/1000 = 9.999
{ 10000,  " =  *.***?\r" }, // error
{-10000,  " =  *.***?\r" }  // error
};

我的代码如下:

void ST7735_sDecOut3(int32_t n) {
    int32_t msd,nsd, lsd;
    int32_t value;
    value=n;
 if (value > 999)
 {
  value = 999;
 }

 msd = value / 100;
 value -= msd * 100;

 nsd = value / 10;
 value -= nsd * 10;

 lsd = value;

 printf("%d%d%d", msd, nsd, lsd);

}

LCD上的输出如下:

enter image description here

我尽可能多地接受这个,这和我到目前为止一样接近。由于我的经验不足,我可能会有一种更容易看到的方法,但我会继续努力,因为这就是我所能做的。

任何提示或帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这不会使用您的数据结构或类型,但可以很容易地进行调整以匹配。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int values[] = { 0, 4, -5, 78, -254, 999, -1000, 1234, -5678, -9999, +9999, 10000, -10000 };
    enum { NUM_VALUES = sizeof(values) / sizeof(values[0]) };

    for (int i = 0; i < NUM_VALUES; i++)
    {
        int32_t value = values[i];
        char integer[2];
        char fraction[4];
        int f_part = abs(value) % 1000;
        int i_part = abs(value) / 1000;
        char sign = ' ';
        if (abs(value) > 9999)
        {
            strcpy(integer, "*");
            strcpy(fraction, "***");
        }
        else
        {
            if (value < 0)
                sign = '-';
            sprintf(integer, "%d", i_part);
            sprintf(fraction, "%.3d", f_part);
        }
        printf("%6d: = %c%s.%s?\\r\n", value, sign, integer, fraction);
    }
    return 0;
}

示例输出:

     0: =  0.000?\r
     4: =  0.004?\r
    -5: = -0.005?\r
    78: =  0.078?\r
  -254: = -0.254?\r
   999: =  0.999?\r
 -1000: = -1.000?\r
  1234: =  1.234?\r
 -5678: = -5.678?\r
 -9999: = -9.999?\r
  9999: =  9.999?\r
 10000: =  *.***?\r
-10000: =  *.***?\r