
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で質問しましょう!
似たような質問が見つかりました
- 社会学 何故、日本は未だに数字を3桁区切りしているんですか? 例)18,000→これを18千円って言う人いま 11 2022/12/31 13:09
- iPhone(アイフォーン) web上の電話番号リンクの桁区切りが、iPhoneだと特定電話番号でおかしくなるのを解決したい 1 2023/03/28 14:27
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- C言語・C++・C# C言語 3 2022/10/04 15:07
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- Visual Basic(VBA) VBAで日付入力しているのですが 4 2023/03/02 11:25
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
- ノートパソコン 大学のレポート作成専用ノートパソコンとして、VAIO SX12(Core i7、32GB、1TB-S 5 2023/06/10 11:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
構造体の各メンバにfor文からア...
-
C言語のfor文です。 繰り返しの...
-
c++ 文字列を入力して、一文字...
-
DxLibについて質問です
-
間接参照のレベルが異なっています
-
ADOレコードセット操作(Forルー...
-
-'0'の意味について
-
間接操作のレベルとは
-
'const char *' 型は 'char *' ...
-
variant型ってどのような仕組み...
-
VC++でコンパイルエラーが出ま...
-
iconv_open失敗
-
charからLPTSTRへの変換方法
-
CStringをwchar_tに変換したい
-
文字列がNULLか空文字列かの判定
-
下記のプログラムがコンパイラ...
-
Linuxでフォルダ内全ファイル名...
-
C言語の入力した文字を反転させ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
間接参照のレベルが異なっています
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
charでの計算?
-
配列をnビットシフトする
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
c言語でユーザ関数を利用して入...
-
干支のプログラム
-
switch文で文字を比較すること...
-
char型からのバイト数取得
-
ネットワークにつながっている...
-
getchar()を int でとる理由...
-
間接操作のレベルとは
-
str系関数を使わずに二つの文字...
おすすめ情報