C言語関係掲示板

過去ログ

No679 数字の桁区切り

[戻る] [ホームページ]
No.7748

数字の桁区切り
投稿者---さろめ(2003/06/25 03:05:22)


収支管理のプログラムを作っているのですが、お金を用いるということで、桁区切りを付けたいのですが、やり方がよく分かりません

例えば、
int m;

printf("数字を入力");
scanf("%d",m);

等で数字を入力させ、受けた数字が
12345なら「12,345」960なら「960」のように1000以上の時は千の位で「,」を入れて表示させてやりたいのですが、どうしたらよいでしょうか?

No.7749

Re:数字の桁区切り
投稿者---YuO(2003/06/25 06:52:17)


>12345なら「12,345」960なら「960」のように1000以上の時は千の位で「,」を入れて表示させてやりたいのですが、どうしたらよいでしょうか?

え〜っと,3桁固定なのでしょうか?
それであれば,一旦文字列に直した後,区切りを自分で入れていくのがよいでしょう。
ポインタとstrncpyで作れると思います。


真面目に金額表示をやるとめちゃくちゃ大変です。
mon_groupingの処理が面倒な上に,(p/n)_cs_precedes/(p/n)_sign_posn/(p/n)_sep_by_spaceが……。

何も考えずに作ってみたら,下のようになりました。
strfcur.c (Shift_JIS / CrLf)
手元で7779バイトありますので,掲示板に載せることは無理です……。

テンポラリ領域としてDBL_MAX_10_EXP * 4バイト以上使う,非常にリッチなコードです。
#さらに,安全のためには出力先としてDBL_MAX_10_EXP * 2バイト程度の容量が必要。
また,数値を切り捨てているため,小数を利用すると誤差が発生します。

それから,日本ロケールに対応していない環境では,当然日本の設定は利用できません。
さらに,VC++/BCCでは,JIS X 3010の記述と異なる動作をします。
localeconv()->n_sign_posnは3が返ってくるし,localeconv()->int_frac_digitsは2が返ってくる……銭?

ちなみに,
  • localeconv()->mon_grouping"\1\0"
  • localeconv()->mon_thousands_sepが2文字以上
のような,無謀な設定までは対応していません。


こーいう関数は,標準にあると便利なんですけどね……。


No.7756

Re:数字の桁区切り
投稿者---nop(2003/06/25 10:07:19)


>12345なら「12,345」960なら「960」のように1000以上の時は千の位で「,」を入れて表示させてやりたいのですが、どうしたらよいでしょうか?

金額と言う以上、少数であることはあり得ないため、
以下のアルゴリズムで良いのでは?

1.数値を文字列に変換
2.変換文字列の後方からループ
  1)3文字目であれば','を挿入し、文字のカウンタをリセット
   ※ただし、その位置が文字列先頭であれば無処理

こんなもので如何でしょう?
※ただし、マイナス値の場合には若干工夫が必要

No.7761

Re:数字の桁区切り
投稿者---かずま(2003/06/25 11:23:10)


> 12345なら「12,345」960なら「960」のように1000以上の時は千の位で
> 「,」を入れて表示させてやりたいのですが、どうしたらよいでしょうか?
#include <stdio.h>

void pwc(unsigned long n)   /* print with comma */
{
    (n > 999) ? (pwc(n/1000), printf(",%03u", n%1000)) : printf("%u", n);
}
    
int main(void)
{
    int m;

    for (;;) {
        printf("input number: ");
        if (scanf("%d", &m) != 1) break;
        pwc(m);
        printf("\n");
    }
    return 0;
}
負の数をどうするか、表示幅の指定をどうするかなどはまた別に考えてみてください。

No.7762

Re:数字の桁区切り
投稿者---かずま(2003/06/25 11:31:03)


 
>   (n > 999) ? (pwc(n/1000), printf(",%03u", n%1000)) : printf("%u", n);

訂正します。

    (n > 999) ? (pwc(n/1000), printf(",%03lu", n%1000)) : printf("%lu", n);