数字を、文字列の変換するために 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でのコーディングをしています。
無理です。自分で機能を実装してください。
無理です。自分で機能を実装してください。
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;
}
}
}
問題、解決しました。
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; }