C言語ケーススタディ 金額を3桁ごとにカンマで区切って表示




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



3桁ごとにカンマで区切って、金額を表示してみましょう。

(1)カンマ区切りでの表示

金額の入力は、ケーススタディ 金額から紙幣・貨幣の枚数を求めると同じものを使用します。 3桁ごとにカンマ区切りするために、まずsprintf関数で金額を文字列に変換します(tmp変数に格納します)。 変換した文字列を結果変数resultにforループ内でコピーしていきます。コピー中に3桁ごとにカンマを挿入していきます。

main()
{
        char    tmp[30], result[30];
        int     i1, i2;
        int     start;
        int     yen;

        scanf("%d", &yen);
        printf("%d円\n", yen);

        sprintf(tmp, "%d", yen);
        start = strlen(tmp) % 3;
        if (start == 0){
                start = 3;
        }
        i2 = 0;
        for (i1 = 0 ; ; i1++){
                result[i2++] = tmp[i1];
                if (tmp[i1] == '\0'){
                        break;
                }
                start--;
                if (start == 0 && tmp[i1+1] != '\0'){
                        result[i2++] = ',';
                        start = 3;
                }
        }
        printf("結果 : %s円\n", result);
}

(2)負の数が正しく動作しない

入力した金額が負の数の場合、(1)のプログラムは正しく動作しません。 そこで、金額が負の数の場合はフラグ(sign)をセットし正の数にしてしまい、最後に負の符号を付加するように変更します。

main()
{
        char    tmp[30], result[30];
        int     i1, i2;
        int     start, sign;
        int     yen;

        scanf("%d", &yen);
        printf("%d円\n", yen);

        if (yen < 0){
                sign = -1;
                yen = -yen;
        }else{
                sign = 1;
        }
        sprintf(tmp, "%d", yen);
        start = strlen(tmp) % 3;
        if (start == 0){
                start = 3;
        }
        i2 = 0;
        for (i1 = 0 ; ; i1++){
                result[i2++] = tmp[i1];
                if (tmp[i1]=='\0'){
                        break;
                }
                start--;
                if (start == 0 && tmp[i1+1] != '\0'){
                        result[i2++] = ',';
                        start = 3;
                }
        }
        if (sign < 0){
                strcpy(tmp, result);
                sprintf(result, "-%s", tmp);
        }

        printf("結果 : %s円\n", result);
}

(3)汎用に使用できる関数に改造

(2)のプログラムを汎用に使用できる関数として作り直します。

char    *MoneyStr(int yen)
{
        static char
                result[30];
        char    tmp[30], result[30];
        int     i1, i2;
        int     start, sign;

        if (yen < 0){
                sign = -1;
                yen = -yen;
        }else{
                sign = 1;
        }
        sprintf(tmp, "%d", yen);
        start = strlen(tmp) % 3;
        if (start == 0){
                start = 3;
        }
        i2 = 0;
        for (i1 = 0 ; ; i1++){
                result[i2++] = tmp[i1];
                if (tmp[i1]=='\0'){
                        break;
                }
                start--;
                if (start == 0 && tmp[i1+1] != '\0'){
                        result[i2++] = ',';
                        start = 3;
                }
        }
        if (sign < 0){
                strcpy(tmp, result);
                sprintf(result, "-%s", tmp);
        }
        return(result);
}


main()
{
        int     yen;

        scanf("%d", &yen);
        printf("%d円\n", yen);
        printf("結果 : %s円\n", MoneyStr(yen));
}

scanf関数は、ちゃんとしたエラーチェックができません。テストプログラム用のお手軽な関数程度に考えておいてください。

【参照関数】
printf
sprintf
scanf

【関連項目】
C言語ケーススタディ 駐車料金の計算
C言語ケーススタディ 金額から紙幣・貨幣の枚数を求める