ページ 11

数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月02日(金) 15:44
by ゴールドマン
数字を、文字列の変換するために sprintf関数でできることは知っていますが、文字列内に3桁毎にカンマを付加しなくてはならなくなりました。(マイナス記号も表示できるようにする)

sprintf関数の拡張機能で、お手軽にできる機能ってご存知ありませんでしょうか?

Re:数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月02日(金) 16:18
by たかぎ
> sprintf関数の拡張機能で、お手軽にできる機能ってご存知ありませんでしょうか?

処理系不明の状況では、拡張などあり得ません。

Re:数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月02日(金) 17:42
by ゴールドマン
失礼いたしました。開発環境は、windows-xp borland c++ 5.0 でWIN32コンソールアプリケーションを作成しております。C++ではなく、Cでのコーディングをしています。

Re:数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月02日(金) 18:47
by たかぎ
> 開発環境は、windows-xp borland c++ 5.0 でWIN32コンソールアプリケーションを作成しております。C++ではなく、Cでのコーディングをしています。

無理です。自分で機能を実装してください。

Re:数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月02日(金) 21:51
by box
ほんのちょっとした例です。


#include <stdio.h>

void addComma(int num, int mod, int d)
{
	int m = num / 10, n = num % 10;
	
	if (num == 0 && d != 0)
		return;
	addComma(m, n, d + 1);
	printf("%d%s", m == 0 ? n : n < 0 ? -n : n, d && d % 3 == 0 ? "," : "");
}

int main(void)
{
	int i;
	
	for (i = -100000; i <= 100000; i += 100)
		addComma(i, 0, 0), putchar('\n');
	return 0;
}

Re:数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月02日(金) 23:16
by box
addComma()の第2引数は不要でありました。

Re:数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月04日(日) 14:53
by ゴールドマン
おお、サンプルコードありがとうございます。比類無きプログラマーさま。
論理は理解しました。
自分なりに組みなおしてみました。
void AddCmm(int num,char *buf) {
int xx = num;
int pp = 0;
int qq = 0;
do{ xx/=10; pp++;} while(xx);
pp += (pp-1) / 3;
buf[pp]=0x00;
while (pp>0){
buf[--pp] = (num % 10) + 0x30;
num /= 10;
if(++qq==3){
buf[--pp] = ',';
qq = 0;
}
}
}
問題、解決しました。

Re:数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月05日(月) 11:02
by GPGA
上記のコードですが、マイナスの値を入れると表示がおかしくなります。
また、ちょうど3桁の場合、エラーが発生しますが大丈夫でしょうか?

Re:数字を3桁ごとにカンマ付文字列に変換する

Posted: 2007年11月05日(月) 14:51
by ゾン兵衛
 
 表示のみと文字列変換、二通り考えてみました。
#include <stdio.h>

#define LEN_MAX 32

void addComma(int n)
{
	int p = n / 1000, q = n % 1000;
	
	if(!p){
		printf("%d", n);
		return;
	}
	addComma(p);
	printf(",%03d", q < 0 ? -q : q);
	return;
}

char *saddComma(char *s, int n, size_t l)
{
	int p = n / 1000, q = n % 1000;
	
	if(!p){
		size_t i;
		
		for(i = 0; n /= 10; i++) ;
		i += 1 + (q < 0);
		if(l <= i) return NULL;
		sprintf(s, "%d", q);
		return s + i;
	}
	if(!(s = saddComma(s, p, l - 4))) return NULL;
	sprintf(s, ",%03d", q < 0 ? -q : q);
	return s + 4;
}

int main(void)
{
	int n;
	char s[LEN_MAX];
	
	scanf("%d", &n);
	addComma(n);
	putchar('\n');
	if(!saddComma(s, n, LEN_MAX)) puts("Area is not enough.");
	else puts(s);
	return 0;
}