■ 漢数字で表記された文字列から数値型を得る
/*
* 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
*/