Last Update: Dec.18,2002

C Source Library

「LSI C-86 Ver.3.30c 試食版」、「Borland C++ 5.5」でコンパイル出来ます。

■ アラビア数字を漢数字表記にする

/*
 *  arb2knj.c : アラビア数字を漢数字表記にする
 *
 *      Copyright (c) 2002 AOK. 
 *
 *      2002.09.10 - 初版
 *
 *  #入力可能なのは半角数字(0-9)のみです。
 *
 */

#include <stdio.h>
#include <string.h>

#define ISSEN   1   /* 千の前に一を入れるかどうか */

const char *suuji[] = {
    "〇", "一", "二", "三", "四",
    "五", "六", "七", "八", "九",
};

const char *keta[] = {
    "〇",
    "一", "十", "百", "千",
    "万", "十", "百", "千",
    "億", "十", "百", "千",
    "兆", "十", "百", "千",
};

char *arabia2kanji(const char *arb, char *knj)
{
    unsigned i, kt1, kt2, num, len, flag;
    char *sav = knj;
    *knj = '\0';
    flag = 0;
    len = strlen(arb);
    if (len < sizeof(keta)/sizeof(keta[0])) {
        for (i=0; i<len; i++) {
            num = *(arb+i) - '0'; /* 数値 */
            kt1 = len - i; /* 桁位置 */
            kt2 = kt1 % 4;
            if (num && (num > 1 || kt2 == 1 
#if ISSEN
                || kt2 == 0
#endif
            )) {
                strcat(knj, suuji[num]);
                flag = 1;
            }
            if (kt1 > 1 && (num || kt2 == 1)) {
                if (flag || num == 1) {
                    strcat(knj, keta[kt1]);
                    flag = 1;
                }
            }
            if (kt2 == 1) flag = 0;
        }
    }
    return sav;
}

int main()
{
    char buf[256], src[127];
    int n;
    while (fgets(src, 127, stdin) && src[0] && src[0] != '\n') {
        n = strlen(src);
        if (src[n - 1] == '\n') src[n - 1] = '\0';
        printf("%10s -> %s\n", src, arabia2kanji(src, buf));
    }
    return 0;
}

/*
         0 -> 
         1 -> 一
        10 -> 十
       100 -> 百
      1000 -> 一千
      1111 -> 一千百十一
     90000 -> 九万
  10000000 -> 一千万
       685 -> 六百八十五
     34000 -> 三万四千
    190687 -> 十九万六百八十七
 100000108 -> 一億百八
  10001001 -> 一千万一千一
2147483647 -> 二十一億四千七百四十八万三千六百四十七
1234567890 -> 十二億三千四百五十六万七千八百九十

*/