在C语言中,格式化带有四舍五入和千位分隔符的字符串最有效的方法是什么?

3
我有一个内部循环的情况,其中包含浮点数和整数值的缓冲区需要以字符串格式复制到另一个缓冲区中。
在格式化字符串时,有哪些替代方案可以实现四舍五入和插入千位分隔符?无论我最终采用什么方法,都必须足够灵活,以允许不同的格式。此外,由于这是一个内部循环场景,我希望尽可能优化任何解决方案。
似乎使用 `locale.h` 是一种方法。但在这种情况下,我如何设置自定义区域设置,以及如何实际使用它们?或者是否有更好的替代方案?如果这是一个新手问题,请指点我正确的方向。
编辑:
以下是一些示例,以澄清:
- `1000` 变成 `1,000`(如果我想使用 `,` 作为千位分隔符) - `1000` 变成 `1 000`(如果我想使用 `空格` 作为千位分隔符) - `1000.123` 变成 `1,000.1`(如果我想四舍五入到一位小数并使用 `,` 作为千位分隔符) - `0` 变成 ``(如果我想将零显示为空字符串)
我在一个 POSIX 系统上...

C++ 可以吗?还是必须要使用普通的 C 语言? - csd
@csd:抱歉,只支持C语言... - c00kiemonster
1个回答

3
您可以尝试使用setlocale设置区域设置,并使用带有'标志和精度值的printf进行舍入。这是否有效取决于您的C库。
请参见以下程序:
#include <locale.h>
#include <stdio.h>

int main()
{
    double value = 1234567890.123;

    if (!setlocale(LC_ALL, "en_US.utf8")) {
        fprintf(stderr, "Locale not found.\n");
        return 1;
    }

    printf("%'.0f\n", value);
    printf("%'.1f\n", value);

    return 0;
}

在我的Ubuntu系统上,输出为:
1,234,567,890
1,234,567,890.1

它只是启用当前语言环境的千位分隔符。 - nwellnhof
能否更改分隔符?使用空格代替。 - MOHAMED
1
不完全是这样。你可以尝试找到使用空格作为千位分隔符的区域设置。法语区域通常使用空格字符,但使用逗号作为小数分隔符。如果您想要一个可移植的解决方案,您必须编写自己的格式化函数。 - nwellnhof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接