Last Update: Nov.12,2005

C Source Library

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

■ 漢数字で表記された文字列から数値型を得る

/*
 *  k2l.c : 漢数字で表記された文字列から数値型を得る
 *
 *  Copyright (c) 2002, 2005 AOK. 
 *
 *      2002.03.14 - 初版
 *      2002.07.25 - 2版
 *      2005.11.12 - 3版
 *
 *  #もっと目が醒めるほどに短くしたいな~
 *
 */

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

#define BUFLEN  127

/* 漢数字の配列 */
struct {
    char *moji; /* 漢字 */
    char value; /* 上位バイト:種別/下位バイト:値 */
} kanji[] = {
    {"〇", 0x00}, {"一", 0x01}, {"二", 0x02}, {"三", 0x03}, {"四", 0x04},
    {"五", 0x05}, {"六", 0x06}, {"七", 0x07}, {"八", 0x08}, {"九", 0x09},
    {"十", 0x11}, {"百", 0x12}, {"千", 0x13}, {"万", 0x24}, {"億", 0x28},
    {"零", 0x00}, {"壱", 0x01}, {"壹", 0x01}, {"弐", 0x02}, {"貳", 0x02},
    {"参", 0x03}, {"參", 0x03}, {"肆", 0x04}, {"伍", 0x05}, {"陸", 0x06},
    {"捌", 0x08}, {"玖", 0x09}, {"拾", 0x11}, {"佰", 0x12}, {"陌", 0x12},
    {"仟", 0x13}, {"阡", 0x13}, {"萬", 0x24}, {"質", 0x07},
};

char buf[BUFLEN];   /* 入力文字列保存用のバッファ */
int pc;             /* バッファの参照位置 */

/* ケツから順に一文字 */
int getvalue(void)
{
    int i;
    char k[3];
    static const int len = sizeof(kanji) / sizeof(kanji[0]);
    if (pc > 1) {
        k[2] = '\0'; k[1] = buf[--pc]; k[0] = buf[--pc];
        for (i = 0; i < len; i++) {
            if (strcmp(k, kanji[i].moji) == 0)
                return kanji[i].value;
        }
    }
    return -1;
}

/* 10 の x 乗 */
long _pow10(unsigned char x)
{
    long r = 1;
    while (x-- > 0) r *= 10;
    return r;
}

/* 変換関数の本体 */
long kanji2long(void)
{
    long c, keta1 = 1, keta2 = 1, num1 = 0, num2 = 0;
    pc = strlen(buf);
    while ((c = getvalue()) != -1) {
        if (c >= 0x00 && c <=0x09) {
            num1 += c * keta1 * keta2;
            keta1 *= 10; num2 = 0;
        } else {
            if (num2) num1 += keta1 * keta2;
            if (c & 0x10) {
                keta1 = _pow10(c & 0x0F);
                num2 = 1;
            } else if (c & 0x20) {
                keta1 = 1;
                keta2 = _pow10(c & 0x0F);
                num2 = 0;
            }
        }
    }
    if (num2) num1 += keta1 * keta2;
    return num1;    
}

int main()
{
    int n;
    /* 上限は 2147483647 */
    while (fgets(buf, BUFLEN, stdin) && buf[0] && buf[0] != '\n') {
        n = strlen(buf);
        if (buf[n - 1] == '\n') buf[n - 1] = '\0';
        /* ... 入力が漢字であることのチェックは省略 ... */
        printf("%38s = %lu\n", buf, kanji2long());
    }
    return 0;
}

/*
                                    〇 = 0
                                    一 = 1
                                    十 = 10
                                    百 = 100
                                    千 = 1000
                                  一千 = 1000
                              千百十一 = 1111
                              一一一一 = 1111
                                一千万 = 10000000
                            六百八十五 = 685
                                六八五 = 685
                              三万四千 = 34000
                            三四〇〇〇 = 34000
                      十九万六百八十七 = 190687
                          一九万六八七 = 190687
                          一九〇六八七 = 190687
                              一億百八 = 100000108
                    一〇〇〇〇〇一〇八 = 100000108
二十一億四千七百四十八万三千六百四十七 = 2147483647
                  二一四七四八三六四七 = 2147483647
  壱拾弐億参千四百五拾六萬七千八百九拾 = 1234567890
*/