我如何添加一个千位分隔符在Windows在C双?(How can I add a thousands

2019-09-22 12:56发布

我用的是MPFR库做的大的数字计算,而且小数点后返回与8位双。

我mpfr_sprintf数字符数组所以精度或任何东西也不会丢失。 一切都只是我没有找到的文档中找到千个分隔符选项(或我错过了)的罚款。

给定一个数字,如20043.95381376我谨代表它像20,043.95381376更好的可读性。

或者,正如164,992,818.48075795数量164992818.48075795

我读到了应添加对printf / sprintf的撇号,但是这似乎是一个UNIX / POSIX的事情,我是一个Windows用户。

由于内部我打印的数量作为一个字符串,我想我可以做的是写一个自定义实现,将自动添加取决于数量的逗号(> 1000> 10000> 100000等),但后来我意识到,像函数strncpy功能或者将strcpy的基本取代,而不是逗号添加到所需的位置。 这里是如何,我又回到了起点上如何做到这一点。

我该怎么做?

Answer 1:

你需要你的执行情况向双值转换为字符串,并检查该字符串的每个字符,然后将其复制到输出字符串分隔一起。

事情是这样的:

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

int thousandsep(double in, char* out_str, size_t out_len, unsigned int precision) {
    char in_str[128], int_str[128], format[32];
    size_t dlen, mod, i, j;
    int c;

    snprintf(format, sizeof format, "%%.%df", precision);
    snprintf(in_str, sizeof in_str, format, in);
    snprintf(int_str, sizeof int_str, "%d", (int)in);

    dlen = strlen(in_str);
    mod = strlen(int_str) % 3;
    c = (mod == 0) ? 3 : mod;

    for (i=0, j=0; i<dlen; i++, j++, c--) {
        if (j >= out_len - 1) {
            /* out_str is too small */
            return -1;
        }

        if (in_str[i] == '.') {
            c = -1;
        } else if (c == 0) {
            out_str[j++] = ',';
            c = 3;
        }

        out_str[j] = in_str[i];
    }
    out_str[j] = '\0';

    return 0;
}

然后使用它像这样:

char out_str[64];

if (thousandsep(20043.95381376, out_str, sizeof out_str, 8) == 0)
    printf("%s\n", out_str);       /* 20,043.95381376 */

if (thousandsep(164992818.48075795, out_str, sizeof out_str, 8) == 0)
    printf("%s\n", out_str);       /* 164,992,818.48075795 */

if (thousandsep(1234567.0, out_str, sizeof out_str, 0) == 0)
    printf("%s\n", out_str);       /* 1,234,567 */

注:我认为如果你在Windows上,你可能会使用MSVC所以这个解决方案应该在C89编译器来工作。



Answer 2:

GetNumberFormatEx将采取数的普通字符串的版本,并与分组分隔符,适当的小数点等通格式化LOCALE_NAME_USER_DEFAULT语言区域,它会在用户首选格式。

如果你需要重写的设置(如精度)一个,你可以填充的违约率NUMBERFMT结构 ,然后改变你需要控制的领域。



Answer 3:

似乎没有成为可以使用的格式化指令。

这里是采取一个字符串包含一个浮点数和插入逗号到合适的地方快速和肮脏的方式。

它使用了几个临时的缓冲区。 千位分隔符将取决于区域设置一样小数点符号。 然而,对于这个例子逗号是硬编码。

这基本上只是需要浮点数的字符串表示,然后通过复制数字到另一个缓冲区,并在适当的地方插入逗号步骤。

你也可以看看有减少缓冲区像我说的这样做,这是快速和肮脏的,而不是非常有效的。

{
    double dFloat = 123456789012.567890;
    char xBuff[128];
    sprintf (xBuff, "%f", dFloat);

    char xBuff2[128];
    int iLen = strlen(xBuff);
    int iPoint = iLen;
    for (iLen--; iLen >= 0; iLen--) {
        if (xBuff[iLen] == '.' || xBuff[iLen] == ',') {
            // found the decimal point.  depends on locale.
            iPoint = iLen;
            break;
        }
    }
    strcpy (xBuff2, xBuff + iPoint);   // save the decimal portion

    char xBuff3[128], xBuff4[128];
    xBuff3[127] = 0;    // set an end of string
    int  iCount, jLen;
    for (iCount = 1, jLen = 126, iLen--; iLen >= 0; jLen--, iLen--) {
        if ((iCount % 4) == 0) {
            xBuff3[jLen] = ',';
            jLen--;
            iCount = 1;
        }
        xBuff3[jLen] = xBuff[iLen];
        iCount++;
    }
    strcpy (xBuff4, xBuff3 + jLen + 1);
    strcat (xBuff4, xBuff2);
}


文章来源: How can I add a thousands separator to a double in C on Windows?