• 締切済み

3桁区切(コンマ)記号をつける方法

C言語を勉強し始めに、計算ソフトを作成しています。 計算結果を3桁区切(例:100,000,000)にしたいのです。 HPを探していろいろ検索してみたりしたのですが、見つからなくて相談する事にしました。(桁区切やC言語などで検索したりしました) アドバイスお願いします。

みんなの回答

  • neko3839
  • ベストアンサー率37% (100/269)
回答No.6

昔作ったもので負数対応版です。 一応動作確認して下さいね。 #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; }

yukichaz
質問者

お礼

ありがとうございます。 試してみます。 勉強し始めで、のろのろしか進んでいませんががんばります!

すると、全ての回答が全文表示されます。
  • neko3839
  • ベストアンサー率37% (100/269)
回答No.5

昔、作った事がありましたので記載します。 #include <stdio.h> #include <string.h> char* numformat(char* , char* ); /*******************************/ /* この main() はテスト用です */ /*******************************/ int main() { 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", num10, numformat(num10, wk)); printf( "in:[%s]-->ot:[%s]\n", num9 , numformat(num9 , wk)); printf( "in:[%s]-->ot:[%s]\n", num8 , numformat(num8 , wk)); printf( "in:[%s]-->ot:[%s]\n", num7 , numformat(num7 , wk)); printf( "in:[%s]-->ot:[%s]\n", num6 , numformat(num6 , wk)); printf( "in:[%s]-->ot:[%s]\n", num5 , numformat(num5 , wk)); printf( "in:[%s]-->ot:[%s]\n", num4 , numformat(num4 , wk)); printf( "in:[%s]-->ot:[%s]\n", num3 , numformat(num3 , wk)); printf( "in:[%s]-->ot:[%s]\n", num2 , numformat(num2 , wk)); printf( "in:[%s]-->ot:[%s]\n", num1 , numformat(num1 , wk)); return 0; } /**************************************************************** * * 関数名 numformat * * 機 能 char* で与えられた10進数文字列に対し、3桁ごとにカンマ * を付加する * * 引 数 char* instr : 変換元の10進数文字列へのポインタ * char* otstr : 変換後の10進数文字列へのポインタ * * 返却値 char* : 変換後の10進数文字列へのポインタ * * 作成日 2000-05-12 * * ***************************************************************** */ char* numformat(char* instr, char* otstr) { char* pin = instr; char* pot = otstr; unsigned int inlength = strlen(instr); unsigned int otlength = inlength + (inlength - 1)/3 + 1; unsigned int i, j; for( i = j = 1; i <= inlength; i++, j++) { if( ((i-1) % 3) ) { } else { pot[otlength-j] = ','; j++; } pot[otlength-j] = pin[inlength-i]; } pot[otlength-1] = '\0'; return(otstr); }

すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

標準的な方法としては、適切なロケールに設定した際に、localeconv関数が返すlconv構造体のthousands_sepフィールドが","になっていれば、printfなどで3桁区切りがカンマになるはずです。 ただし、これに対応している処理系はほとんどないと思います。 ちなみに、C++であれば、 std::cout.imbue(std::locale("")); としてから標準出力に数値を書き込めば、3桁区切りが出力されることが多いようです。

yukichaz
質問者

お礼

ありがとうございます。 いろいろ調べながら進めていきたいとおもいます。 思い通りのものができればいいなーと がんばります!

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2 ですが #include <ctype.h> を追加 if(i != 0 && i % 3 == 0){ //3桁毎に','を挿入 を if(isdigit(*p) && i != 0 && i % 3 == 0){ //3桁毎に','を挿入 に修正

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

サンプルを作ってみました ---------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> char *commaFormat(char *outbuf, char *num){ int len, i ; char *periodp; char *p; char *outp = outbuf; len = strlen(num); p = num + len -1; //文字列の最後の文字 periodp = strchr(num, '.'); //ピリオドの位置を探す if(periodp != NULL){ while(periodp<=p){ *outp++=*p--; // ピリオドまでコピー } } for(i=0;num <=p && *p != ' ';i++){ //先頭あるいはスペースになるまでコピー if(i != 0 && i % 3 == 0){ //3桁毎に','を挿入 *outp++ = ','; } *outp++=*p--; } *outp='\0'; strrev(outbuf); return outbuf; } int main(void){ char buff[32]; char num[32]; sprintf(num, "%ld", 100000000L);//数値の書式はメインでやる printf("%s\n", commaFormat(buff, num)); sprintf(num, "%#18.12g", 100000000.99);//小数がある場合 printf("%s\n", num); printf("%s\n", commaFormat(buff, num));//数値の前の空白は捨てられる return 0; }

yukichaz
質問者

お礼

ありがとうございます。 やはり、そのためのプログラムを書かないとだめだったのですね。 早速試してみたいと思います。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Cの標準関数としては無いと思うので、 文字列に変換して、3桁毎出力バッファに,を挿入していくようなプログラムを作ることになると思います。

すると、全ての回答が全文表示されます。

関連するQ&A