单片机float转字符数组用于显示

单片机float转字符数组用于显示

一、代码

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

typedef  char u8;

void my_sprintf(char *buf, u8 L_inte, u8 L_deci, float *data);
void clear_buf(char *buf, int L);
void my_printf(char *buf, int L);

int main()
{
	float m = -1234.5678;
	char buf[11];
	clear_buf(buf,10);
	my_sprintf(buf,5,5,&m);
	my_printf(buf,10);
	clear_buf(buf,10);
	printf("%c", '\n');
	
	my_sprintf(buf,4,5,&m);
	my_printf(buf,10);
	clear_buf(buf,10);
	printf("%c", '\n');
	
	my_sprintf(buf,4,4,&m);
	my_printf(buf,10);
	clear_buf(buf,10);
	printf("%c", '\n');
	
	my_sprintf(buf,3,4,&m);
	my_printf(buf,10);
	clear_buf(buf,10);
	printf("%c", '\n');
	
	my_sprintf(buf,3,3,&m);
	my_printf(buf,10);
	clear_buf(buf,10);
	printf("%c", '\n');
	
	return 0;
}

void my_sprintf(char *buf, u8 L_inte, u8 L_deci, float *data)      //用完要把buf清除。 
{
	int i=0;
	int j=0;
	double d_data;
	double temp;
	u8 sign;     //sign=0, 正数   sign=1  负数 
	int L=L_inte+L_deci;      //buf长度要大于等于L+1
	d_data = (*data) * pow(10,L_deci);
	sign = (d_data >=0 )?0:1;
	if(d_data < 0)
		d_data = 0-d_data;
		
	for(i=0;i<L; i++)
	{
		temp = 0;
		for(j=0;j<=i;j++)
		{
			temp = (*(buf+j))*pow(10,L-j-1) + temp;
		}
		*(buf+i) = (char)(((d_data-temp)/pow(10,L-i-1)));
	}
	for(i=0;i<L; i++)
	{
		*(buf+i) = 0x30+*(buf+i);
	}
	for(i=L;i>=L_inte+1;i--)
	{
		*(buf+i) = *(buf+i-1);
	}
	*(buf+i) = '.';
	if(sign == 1)
	{
		for(i=L+2;i>=1;i--)
		{
			*(buf+i) = *(buf+i-1);
		}
		*(buf)='-';
	}
	
} 

void clear_buf(char *buf, int L)
{
	int i=0;
	for(i=0;i<L;i++)
	{
		*(buf+i)='\0';
	}
}

void my_printf(char *buf, int L)
{
	int i=0;
	for(i=0;i<L;i++)
	{
		printf("%c", *(buf+i));
	}
}

结果
在这里插入图片描述
然后转换一下负数看一下
在这里插入图片描述

总结

功能有些不完善,比如1234.5678。那么前面的整数部分长度必须要比实际长,比如此处要大于等于4,小于4则可能出现乱码。另外float精度不高,可能转换会有误差,同时要自己提前保证保存转换结果的数组长度要大于最终结果的长度。在此做个备份。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值