加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何在Windows上的C中为double添加千位分隔符?

发布时间:2020-12-14 05:28:06 所属栏目:Windows 来源:网络整理
导读:我使用MPFR库对大数字进行计算,但也返回小数点后8位数的双精度数. 我mpfr_sprintf一个char数组的数字,所以精度或任何东西都不会丢失. 一切都很好,除了我没有在文档中找到任何千分隔符选项(或我错过了它). 鉴于像20043.95381376这样的数字,我想代表它像20,043
我使用MPFR库对大数字进行计算,但也返回小数点后8位数的双精度数.

我mpfr_sprintf一个char数组的数字,所以精度或任何东西都不会丢失.
一切都很好,除了我没有在文档中找到任何千分隔符选项(或我错过了它).

鉴于像20043.95381376这样的数字,我想代表它像20,043.95381376以获得更好的可读性.

或者数字164992818.48075795为164,992,818.48075795

我读到了应该添加到printf / sprintf的撇号,但这似乎是一个UNIX / POSIX的东西,我是一个Windows用户.

因为在内部我将数字打印为字符串,我认为我能做的是编写一个自定义实现,根据数字(> 1000> 10000> 100000等)自动添加逗号,但后来我意识到这样的功能strncpy或strcpy将基本上替换,而不是将逗号添加到所需位置.以下是我如何回答如何做到这一点.

我该怎么做?

解决方法

您需要实现将double值转换为string并检查该字符串的每个字符,然后将其与分隔符一起复制到输出字符串.

像这样的东西:

#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] = '';

    return 0;
}

然后像这样使用它:

char out_str[64];

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

if (thousandsep(164992818.48075795,out_str);       /* 164,818.48075795 */

if (thousandsep(1234567.0,0) == 0)
    printf("%sn",out_str);       /* 1,234,567 */

注意:我假设如果你在Windows上,你可能正在使用MSVC,所以这个解决方案应该在C89编译器上工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读