A 回答 (6件)
- 最新から表示
- 回答順に表示
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;
}
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 intinlength = strlen(instr);
unsigned intotlength = inlength + (inlength - 1)/3 + 1;
unsigned inti, 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);
}
No.4
- 回答日時:
標準的な方法としては、適切なロケールに設定した際に、localeconv関数が返すlconv構造体のthousands_sepフィールドが","になっていれば、printfなどで3桁区切りがカンマになるはずです。
ただし、これに対応している処理系はほとんどないと思います。
ちなみに、C++であれば、
std::cout.imbue(std::locale(""));
としてから標準出力に数値を書き込めば、3桁区切りが出力されることが多いようです。
No.3
- 回答日時:
#2 ですが
#include <ctype.h>
を追加
if(i != 0 && i % 3 == 0){ //3桁毎に','を挿入
を
if(isdigit(*p) && i != 0 && i % 3 == 0){ //3桁毎に','を挿入
に修正
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて見た映画を教えてください!
初めて見た映画を覚えていますか?
-
【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
【お題】・忍者がやってるYouTubeが炎上してしまった理由
-
コンビニでおにぎりを買うときのスタメンはどの具?
コンビニでおにぎりを買うとき、何の具材を選ぶことが多いですか?
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
数字列を3桁ごとにカンマで区切る方法
C言語・C++・C#
-
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
C言語でのカンマ区切りについて
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
-
間接操作のレベルとは
-
ランダムな英文字の文字列作成
-
Win32APIでのエディットボック...
-
C言語です
-
文字列の中のカンマを消したい
-
テキストデータをそのままバイ...
-
「ポインタのポインタ」を使っ...
-
switch文で文字を比較すること...
-
int型からchar型への変換
-
const char** p;のとき、free(p...
-
ネットワークにつながっている...
-
数値を文字化するにはどうすれ...
-
double型の値をchar配列に変換...
-
-'0'の意味について
-
charからLPTSTRへの変換方法
-
CStringをwchar_tに変換したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
CStringをwchar_tに変換したい
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
テキストデータをそのままバイ...
-
絶対パスからのファイル名の切...
-
double型の値をchar配列に変換...
-
型変換
-
間接操作のレベルとは
-
'const char *' 型は 'char *' ...
-
ネットワークにつながっている...
-
YUV⇔RGB変換がうまくいきません。
-
間接参照のレベルが異なっています
-
str系関数を使わずに二つの文字...
-
strncpyと_tcsncpy_sのヌルの扱...
-
c++ 文字列を入力して、一文字...
-
iconv_open失敗
-
干支のプログラム
おすすめ情報