C#
大字に変換
コーディング
public static string ToDaiji(string Value)
{
if ((Value == null) || (Value.Length == 0))
{
return string.Empty;
}
if (Value.Length > (1 << 22))
{
throw new ArgumentException("文字列が長すぎます。", "Value");
}
foreach (char c in Value)
{
if ((c < '0') || (c > '9'))
{
throw new ArgumentException("数字以外の文字が含まれています。", "Value");
}
}
int[] Units = new int[22];
int UnitIndex = 0;
{
int FirstIndex = -1;
for (int i = 0; i < Value.Length; i++)
{
char c = Value[i];
if (c != '0')
{
FirstIndex = i;
break;
}
}
if (FirstIndex < 0)
{
return "零";
}
if (Value.Length - FirstIndex > 88)
{
return "無量大数";
}
int FirstLimit = FirstIndex + 4;
int n = Value.Length;
while (n > FirstLimit)
{
Units[UnitIndex++] = ((n -= 4) << 4) | 4;
}
if (n > FirstIndex)
{
Units[UnitIndex++] = (FirstIndex << 4) | (n - FirstIndex);
}
}
StringBuilder Builder = new StringBuilder();
bool HasAppended = false;
char[] DaijiNumbers = { '壱', '弐', '参', '四', '伍', '六', '七', '八', '九' };
char[] DaijiUnits_1 = { '拾', '佰', '阡' };
Action ProcessUnit = delegate
{
int Unit = Units[--UnitIndex];
int Index = Unit >> 4;
int Length = Unit & 0x0f;
HasAppended = false;
for (int i = 0; i < Length; i++)
{
char c = Value[Index++];
if (c == '0')
{
continue;
}
Builder.Append(DaijiNumbers[c - '1']);
int n = Length - i - 2;
if (n >= 0)
{
Builder.Append(DaijiUnits_1[n]);
}
HasAppended = true;
}
};
char[] DaijiUnits_2 = { '萬', '億', '兆', '京', '垓', '杼', '穣', '溝', '澗', '正', '載' };
string[] DaijiUnits_3 = { "極", "恒河沙", "阿僧祇", "那由他", "不可思議" };
while (true)
{
ProcessUnit();
if (UnitIndex == 0)
{
return Builder.ToString();
}
if (!HasAppended)
{
continue;
}
if (UnitIndex < 12)
{
Builder.Append(DaijiUnits_2[UnitIndex - 1]);
continue;
}
if ((UnitIndex & 1) != 0)
{
Builder.Append(DaijiUnits_2[0]);
ProcessUnit();
}
Builder.Append(DaijiUnits_3[(UnitIndex - 12) >> 1]);
}
}
大字の表記
数字 | 漢数字 | 大字 |
0 | 〇 | 零 |
1 | 一 | 壱 |
2 | 二 | 弐 |
3 | 三 | 参 |
4 | 四 | 四 |
5 | 五 | 伍 |
6 | 六 | 六 |
7 | 七 | 七 |
8 | 八 | 八 |
9 | 九 | 九 |
10 | 十 | 拾 |
100 | 百 | 佰 |
1000 | 千 | 阡 |
10000 | 万 | 萬 |
※通常使用する表記を記載した。
漢数字の単位
一 | 十 | 百 | 千 | 万 まん | |
104 | 105 | 106 | 107 |
一 | 十 | 百 | 千 | 億 おく | |
108 | 109 | 1010 | 1011 |
一 | 十 | 百 | 千 | 兆 ちょう | |
1012 | 1013 | 1014 | 1015 |
一 | 十 | 百 | 千 | 京 けい | |
1016 | 1017 | 1018 | 1019 |
一 | 十 | 百 | 千 | 垓 がい | |
1020 | 1021 | 1022 | 1023 |
一 | 十 | 百 | 千 | 杼 じょ | |
1024 | 1025 | 1026 | 1027 |
※正しくは「禾」へんに「予」 |
一 | 十 | 百 | 千 | 穣 じょう | |
1028 | 1029 | 1030 | 1031 |
一 | 十 | 百 | 千 | 溝 こう | |
1032 | 1033 | 1034 | 1035 |
一 | 十 | 百 | 千 | 澗 かん | |
1036 | 1037 | 1038 | 1039 |
一 | 十 | 百 | 千 | 正 せい | |
1040 | 1041 | 1042 | 1043 |
一 | 十 | 百 | 千 | 載 さい | |
1044 | 1045 | 1046 | 1047 |
一 | 十 | 百 | 千 | | 極 ごく |
1048 | 1049 | 1050 | 1051 |
一 | 十 | 百 | 千 | 万 |
1052 | 1053 | 1054 | 1055 |
一 | 十 | 百 | 千 | | 恒河沙 ごうがしゃ |
1056 | 1057 | 1058 | 1059 |
一 | 十 | 百 | 千 | 万 |
1060 | 1061 | 1062 | 1063 |
一 | 十 | 百 | 千 | | 阿僧祇 あそうぎ |
1064 | 1065 | 1066 | 1067 |
一 | 十 | 百 | 千 | 万 |
1068 | 1069 | 1070 | 1071 |
一 | 十 | 百 | 千 | | 那由他 なゆた |
1072 | 1073 | 1074 | 1075 |
一 | 十 | 百 | 千 | 万 |
1076 | 1077 | 1078 | 1079 |
一 | 十 | 百 | 千 | | 不可思議 ふかしぎ |
1080 | 1081 | 1082 | 1083 |
一 | 十 | 百 | 千 | 万 |
1084 | 1085 | 1086 | 1087 |
一 | | | | 無量大数 むりょうたいすう |
1088 | | | |
※1088以上は無量大数 |
「不可思議」のような8桁を使う単位では、「21万6千不可思議」のように「万」を使って上位4桁が表現されるらしい。
例
123456789
下位から4桁ずつに分ける。
上位から処理していく。
Index = 1 |
2 | 3 | 4 | 5 | 萬 |
弐阡 | 参佰 | 四拾 | 伍 |
Index = 0 |
6 | 7 | 8 | 9 | |
六阡 | 七佰 | 八拾 | 九 |
連結する。
壱 億 弐阡 参佰 四拾 伍 萬 六阡 七佰 八拾 九
4桁の数字を処理するルーチンを作って、単位と組み合わせればできそうだ。
(2021/02/18 初稿)