C语言 插入小数点的字符串

jdgnovmf  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(148)

我有一个4位数宽的整数,我使用sprintf将其转换为字符串。这个字符串数组应该表示一个十进制数XX. XX。eg.

uint16_t Value;
char buff [10];
Value = 1234;
sprintf(buff,"%04d", (unsigned int)Value);

我想显示这一点说,液晶显示器或液晶显示器12.34。最简单(粗糙)的方法是解析并输出数组,逐个元素,插入小数点,然后输出数组的其余部分。有没有更好的方法来做到这一点?
编辑:我想我有点过于简化了。要打印的数字可以是00.00和99.99之间的任何数字。
sprintf(buff,"%04d”,(unsigned int)Value);
我假设这将垫与领先的0的时候需要的。这种编码扭曲的主要原因是为了避免浮点运算和printf的使用。我会把一个字符串指针传递给一个函数,这个函数会一个字符一个字符地显示。

mo49yndu

mo49yndu1#

如果你只处理4位宽的整数,一个简单的解决方案可能是:

#include <stdio.h>

int main() {
    int number = 1234;
    char buffer[200];
    sprintf(buffer, "%.2f", number/100.0);
    printf("%s\n", buffer);

    return 0;
}
kqhtkvqz

kqhtkvqz2#

注意:这两个都不会形成空终止的C字符串。通常,LCD显示器的API提供了一个更简单(更快)的选项,可以将“n”字符写入显示器。
如果这是一个微控制器,你不想所有的(笨重的,也许 * 未使用 *)机器的printf(),有以下:

void cnvrt( unsigned val, char buf[5] ) {
    buf[4] = '0' + (val % 10); val /= 10; // Least Significant Digit
    buf[3] = '0' + (val % 10); val /= 10;
    buf[2] = '.'; // separator
    buf[1] = '0' + (val % 10); val /= 10;
    buf[0] = '0' + (val % 10); // MSD
}

如果是val < 1000val > 9999,这仍然有效。
或者,你可能希望它是一个循环:

void cnvrt( unsigned val, char buf[5] ) {
    for( unsigned i = 5; i--; ) {
        if( i == 2 ) buf[ i-- ] = '.';
        buf[ i ] = '0' + (val % 10);
        val /= 10;
    }
}
k4emjkb1

k4emjkb13#

如果你知道总有4位数,你可以做到这一点,而不做任何额外的算术:

int main(void)
{
    int number = 2500;
    int bufsize = 64;
    char buf[bufsize];
    snprintf(buf, bufsize, "%d", number);
    printf("%c%c.%c%c\n", buf[0], buf[1], buf[2], buf[3]);
    return 0;
}

输出:25.00

50pmv0ei

50pmv0ei4#

表示十进制数XX.XX
一个简单的方法是将值转换为浮点数,然后打印。

// 0 to '0' pad as needed
// 5 for minimum text width as in XX.XX
// .2 for always 2 digits after the '.'
sprintf(buff,"%05.2f", (double)Value / 100.0);

如果想避免浮点运算,将整数和分数打印为2部分。

sprintf(buff,"%02u.%02u", Value/100u, Value%100u);  // Note the u in 100u

注意Value是一个 unsigned 类型。对于 signed 类型,我们需要在fraction中避免'-'

sprintf(buff,"%02d.%02d", iValue/100, abs(iValue%100));

在所有情况下,16位uint16_t可能具有1000-9999范围之外的值(“我有一个整数4位”),因此OP需要定义该范围之外的所需输出。
一个简单的技术来确保Value < 10000,即使我们“知道”Value不应该是5位数:

Value %= 10000u;
sprintf(...

相关问题