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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ゴールドマン

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

#1

投稿記事 by ゴールドマン » 18年前

数字を、文字列の変換するために sprintf関数でできることは知っていますが、文字列内に3桁毎にカンマを付加しなくてはならなくなりました。(マイナス記号も表示できるようにする)

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

たかぎ

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

#2

投稿記事 by たかぎ » 18年前

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

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

ゴールドマン

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

#3

投稿記事 by ゴールドマン » 18年前

失礼いたしました。開発環境は、windows-xp borland c++ 5.0 でWIN32コンソールアプリケーションを作成しております。C++ではなく、Cでのコーディングをしています。

たかぎ

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

#4

投稿記事 by たかぎ » 18年前

> 開発環境は、windows-xp borland c++ 5.0 でWIN32コンソールアプリケーションを作成しております。C++ではなく、Cでのコーディングをしています。

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

box

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

#5

投稿記事 by box » 18年前

ほんのちょっとした例です。


#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;
}

box

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

#6

投稿記事 by box » 18年前

addComma()の第2引数は不要でありました。

ゴールドマン

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

#7

投稿記事 by ゴールドマン » 18年前

おお、サンプルコードありがとうございます。比類無きプログラマーさま。
論理は理解しました。
自分なりに組みなおしてみました。
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;
}
}
}
問題、解決しました。

GPGA

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

#8

投稿記事 by GPGA » 18年前

上記のコードですが、マイナスの値を入れると表示がおかしくなります。
また、ちょうど3桁の場合、エラーが発生しますが大丈夫でしょうか?

ゾン兵衛

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

#9

投稿記事 by ゾン兵衛 » 18年前

 
 表示のみと文字列変換、二通り考えてみました。
#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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る