首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求简略代码把 一个3335435 转换成字符串"3,335,435"

2013-03-06 
求简单代码把 一个3335435 转换成字符串3,335,435把int型格式化到字符串,按每3位一个逗号比如char sz[12

求简单代码把 一个3335435 转换成字符串"3,335,435"
把int型格式化到字符串,按每3位一个逗号

比如
char sz[128];
int num=3335435;
_snprintf(sz, 127, "数字:%d", num);
输出:
数字:3335435

最后一行_snprintf 应该改成什么样,才能输出:
数字3,335,435

呢?? 字符串
[解决办法]
http://bbs.bccn.net/thread-348122-1-1.html
[解决办法]
没有直接的支持,以下代码供你参考:


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

void comai(unsigned long n, char* str)
{
int len;
int ic;
int c3;
int i;

sprintf(str, "%ld", n);
len = strlen(str);
ic = len / 3;
if(len % 3 == 0) ic--;

str[len + ic] = '\0';
i = len - 1;
c3 = 0;
while(ic != 0 && i >= 0)
{
str[i + ic] = str[i];
if(c3++ == 2)
{
c3 = 0;
str[i + ic - 1] = ',';
ic--;
}
i--;
}
}

int main(int argc, char* argv[])
{
char str[128];

comai(3335435, str);
printf("%s\n", str);

return 0;
}

[解决办法]
上一个错了

string s="";
stringstream ss;
while (int number>0)
{
    string temp;
    ss<<number%1000;
    ss>>temp;
    s=temp+','+s;
    number/=1000
}
s=s.substr(0,s.length()-1);

[解决办法]
sprintf直接支持,只需设置正确的locale

/**
 * @file    thousands_sep.c
 * @author  mymtom
 */

#include <stdio.h>
#include <locale.h>

int main(int argc, char *argv[])
{
    int n = 3335435;
    char s[20];

    setlocale(LC_NUMERIC, "en_US.ISO8859-1");
    sprintf(s, "%'d", n);
    printf("%s\n", s);

    return 0;
}

[解决办法]
引用:
sprintf直接支持,只需设置正确的locale


C/C++ code
?



1234567891011121314151617181920

/**  * @file    thousands_sep.c  * @author  mymtom  */  #include <stdio.h> #include <locale.h>   int main(int arg……
vs2005下测试,结果显示:'d
to lz:如果没有现成的转换函数,那就自己搞了,思路就是先转换成字符串(比如使用sprintf格式化),然后对这个字符串进行处理一下就可以了,示例代码:
// 字符串翻转,返回翻转的字符个数
size_t rever(char *dest,const char *src) 
{   
int n = strlen(src) - 1;       
size_t i = 0;
for (;n >= 0;dest++,n--)


{
*dest = *(src + n); 
++i;
}
return i;  // 注意返回翻转的字符个数 
}

int _tmain(int argc, _TCHAR* argv[])
{
int n = -54665554;     
char s[30] = {0};       
sprintf(s, "%d", n);     
char sDes[30] = {0};
char *p1 = s + strlen(s) - 1;
char *p2 = sDes;
int i = 1;
while (p1 >= s)
{
if ((i++)%4 == 0)
{
*p2 = ',';
}
else
{
*p2 = *p1;
p1--;
}
p2++;
}
memset(s ,0 ,30);
rever(s,sDes);
printf("%s\n", s); 
return 0;
}


[解决办法]
引用:
sprintf直接支持,只需设置正确的locale
C/C++ code?12345678910111213141516171819/** * @file    thousands_sep.c * @author  mymtom */ #include <stdio.h>#include <locale.h> int main(int argc, char *argv[……


Nice
[解决办法]
引用:
引用:
sprintf直接支持,只需设置正确的locale


C/C++ code
?



1234567891011121314151617181920

/**  * @file    thousands_sep.c  * @author  mymtom  */  #include <stdio.h> #include <locale.h……
这句 if ((i++)%4 == 0) 得加个条件 *p1 != '-'
也就是改为if ((i++)%4 == 0 && *p1 != '-')
否则有个bug,会出现-123,转换为“-,123”。
[解决办法]
char * comma(__int64 num) {
    static char commades[80];
    static char commasrc[80];

    sprintf(commasrc,"%I64d",num);
    int L=strlen(commasrc);
    register int j=0;
    register int k=0;
    for (int i=L-1;i>=0;i--) {
        commades[j]=commasrc[i];
        k++;
        j++;
        if ((k%3)==0 && i>0) {
            commades[j]=',';
            j++;
        }
    }
    commades[j]=0;
    strcpy(commades,strrev(commades));
    return commades;
}

[解决办法]
如果windows的话,为了在多字节跟宽字节中来回使用,还是用这个好。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

PTCHAR FormatNumber(PTCHAR pbuf, DWORD bufsize, DWORD value)
{
PTCHAR tmp = new TCHAR[16];
DWORD offset = 0;


ZeroMemory(tmp, 16*sizeof(TCHAR));
ZeroMemory(pbuf, bufsize*sizeof(TCHAR));

wsprintf(tmp, TEXT("%u"), value);
DWORD lenth = _tcslen(tmp);
if ( bufsize < lenth+lenth/3+1 )
{
return NULL;
}
offset = lenth%3;
_tcsncpy(pbuf , tmp, offset);
for (DWORD i=0; i<lenth/3; i++, offset+=3)
{
_tcscat(pbuf, TEXT(","));
_tcsncat(pbuf, tmp+offset, 3);
}
delete tmp;
return pbuf;
}


int main(int argc, char* argv[])
{
TCHAR buf[1024];
_tprintf(TEXT("%s\n"), FormatNumber(buf, 1024, 0xFFFFFFFF));
return 0;
}


如果是Linux下的话,你自己弄了

热点排行