昔作ったもので負数対応版です。
一応動作確認して下さいね。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* numformat1(char* , char* );
char* numformat2(long, char*, int);
char* numformat3(long, int);
int main()
{
static char num[] ="-2147483648";
static char num10[]="-1234567890";
static char num9[] ="-123456789";
static char num8[] ="12345678";
static char num7[] ="-1234567";
static char num6[] ="123456";
static char num5[] ="-12345";
static char num4[] ="1234";
static char num3[] ="-123";
static char num2[] ="-12";
static char num1[] ="-1";
char wk[20];
printf( "in:[%s]-->ot:[%s]\n", num , numformat2( atol(num) , wk, 11 ) );
printf( "in:[%s]-->ot:[%s]\n", num10, numformat2( atol(num10), wk, 10 ) );
printf( "in:[%s]-->ot:[%s]\n", num9 , numformat2( atol(num9), wk, 9 ) );
printf( "in:[%s]-->ot:[%s]\n", num8 , numformat2( atol(num8), wk, 8 ) );
printf( "in:[%s]-->ot:[%s]\n", num7 , numformat2( atol(num7), wk, 7 ) );
printf( "in:[%s]-->ot:[%s]\n", num6 , numformat2( atol(num6), wk, 6 ) );
printf( "in:[%s]-->ot:[%s]\n", num5 , numformat2( atol(num5), wk, 5 ) );
printf( "in:[%s]-->ot:[%s]\n", num4 , numformat2( atol(num4), wk, 4 ) );
printf( "in:[%s]-->ot:[%s]\n", num3 , numformat2( atol(num3), wk, 3 ) );
printf( "in:[%s]-->ot:[%s]\n", num2 , numformat2( atol(num2), wk, 2 ) );
printf( "in:[%s]-->ot:[%s]\n", num1 , numformat2( atol(num1), wk, 1 ) );
puts("---------------------------------------\n");
return 0;
}
/****************************************************************
*
* 関数名 numformat
*
* 機 能 char* で与えられた10進数文字列に対し、3桁ごとにカンマ
* を付加する
*
* 引 数 char* instr : 変換元の10進数文字列へのポインタ
* char* otstr : 変換後の10進数文字列へのポインタ
*
* 返却値 char* : 変換後の10進数文字列へのポインタ
*
* 作成日 2000-05-12
*
*
*****************************************************************
*/
char* numformat2(long n, char* s, int w)
{
int k = 0; /* 桁数カウント用 */
int sign; /* 符号 */
long j = n; /* 桁チェック用 */
char *p, *q;
sign = n < 0 ? -1 : 1; /* 符号をチェック */
do k++; while (j /= 10); /* 桁数をカウント */
k += (k - 1) / 3 + (sign < 0); /* カンマの個数と負号(-)の分を加える */
w = max(w, k); /* 指定された幅と実際に必要な幅の大きいほう */
if(!(p = malloc(w+1))) return NULL; /* 出力用バッファの確保 */
memset(p, ' ', w ); /* すべてをスペースで埋ておく */
q = p + w; /* 後ろから詰め込む */
*q-- = '\0'; /* 文字列にする */
k = 3;
do {
if (k-- == 0) {
*q-- = ','; /* 3桁ごとにカンマを挿入 */
k = 2; /* 桁のカウンタをリセット */
}
*q-- = (char)(labs(n % 10) + '0'); /* 下位の桁から数字をセット */
} while (n /= 10); /* 下位の桁を切り詰め、0になるまで */
if (sign < 0)
*q = '-';
strcpy(s, p);
free(p);
return s;
}
お礼
ありがとうございます。 試してみます。 勉強し始めで、のろのろしか進んでいませんががんばります!