数字を、文字列の変換するために sprintf関数でできることは知っていますが、文字列内に3桁毎にカンマを付加しなくてはならなくなりました。(マイナス記号も表示できるようにする)
sprintf関数の拡張機能で、お手軽にできる機能ってご存知ありませんでしょうか?
数字を3桁ごとにカンマ付文字列に変換する
-
たかぎ
Re:数字を3桁ごとにカンマ付文字列に変換する
> sprintf関数の拡張機能で、お手軽にできる機能ってご存知ありませんでしょうか?
処理系不明の状況では、拡張などあり得ません。
処理系不明の状況では、拡張などあり得ません。
-
ゴールドマン
Re:数字を3桁ごとにカンマ付文字列に変換する
失礼いたしました。開発環境は、windows-xp borland c++ 5.0 でWIN32コンソールアプリケーションを作成しております。C++ではなく、Cでのコーディングをしています。
-
たかぎ
Re:数字を3桁ごとにカンマ付文字列に変換する
> 開発環境は、windows-xp borland c++ 5.0 でWIN32コンソールアプリケーションを作成しております。C++ではなく、Cでのコーディングをしています。
無理です。自分で機能を実装してください。
無理です。自分で機能を実装してください。
-
box
Re:数字を3桁ごとにカンマ付文字列に変換する
ほんのちょっとした例です。
#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桁ごとにカンマ付文字列に変換する
おお、サンプルコードありがとうございます。比類無きプログラマーさま。
論理は理解しました。
自分なりに組みなおしてみました。
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;
}
}
}
問題、解決しました。
論理は理解しました。
自分なりに組みなおしてみました。
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桁ごとにカンマ付文字列に変換する
上記のコードですが、マイナスの値を入れると表示がおかしくなります。
また、ちょうど3桁の場合、エラーが発生しますが大丈夫でしょうか?
また、ちょうど3桁の場合、エラーが発生しますが大丈夫でしょうか?
-
ゾン兵衛
Re:数字を3桁ごとにカンマ付文字列に変換する
表示のみと文字列変換、二通り考えてみました。
#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;
}