ブラウザアドオンを開発した際に、漢数字の文字列から数値への変換を実装しました。
せっかくなので何をしたのか、必要な知識などをまとめた次第です。
この漢数字変換を使っているのは、 daisy WarekiConv という和暦を西暦に変換表示してくれるブラウザアドオンです。
(Chromeにも対応。)
昭和や皇紀といった和暦で表記された年号を、頭で計算しなくても西暦に自動計算して表示してくれます。
このとき、和暦は年が漢数字で表記されていることが多かったため、漢数字文字列の変換が必要になった次第です。
なおソースコードをgithubのWarekiConvプロジェクトページにて公開しています。
(`kanNum.js`というファイルが漢数字変換なのですが、名前を変えるかもしれないので直リンクはしていません。)
## 前段の処理 / 文字列から漢数字列の抽出
実際に変換を行うまえに、まず必要な前処理から。
現実では解説などの文字列のなかに対象が埋まっており、漢数字部分だけ綺麗に存在するわけではないので抽出が必要です。
方法としてはあまりに単純、すべての漢数字文字を変数にあつめておき、これで作った正規表現でマッチをかけます。
```
const rsRekiStrNum = `元年|\\d+年?|[${wideNumAllChars}]+年?`;
```
## 漢数字文字列のいくつかのパタン
全角数字は
`1024`
くらいしかパタンがないのですが、漢数字はいくつかのパタンがあり、ちょっとした細則も持っています。
漢数字の場合は、以下のパタンが考えられます。
`一〇二四`
`千二十四`
`壱阡弐拾四`
`壱阡廿四`
大きなパタン分類として『桁の有無』、桁を書く場合と書かない場合があります。
-- 桁を書く場合、数がゼロの桁は桁の文字を省略する。
-- 桁を書かない場合、数がゼロの桁は`〇`。
さらに、以下のようないくつかの細則があり、またバリエーションが生まれます。
- 桁の数字が`1`のとき、文字を省略する場合としない場合がある。
- 『漢数字』と『大字』2種類の文字がある。
(この説明では、記述により多くの場合は両方まとめて漢数字と呼びながら書いています。)
- 『漢数字』『大字』では、同じ数字を表す文字が1つではない場合がある。
- 桁と数が一緒になっている文字もある(例:'卄'が20を表すなど)。
桁の数字が`1`のときというのは、たとえば1000の場合、
`千`
`壱阡`
のどちらでもかまわないということです。
漢数字、大字はそれぞれ
'〇一二三四五六七八九'
'零壱弐参肆伍陸漆捌玖'
というやつです。
同じ数字をあらわす文字として、たとえば以下はすべて『2』です。
'二弐弌貳貮弍'
----
以上、本記事では数字をあらわす漢数字と大字の文字列について、あつかうための前処理とパタン、また変換のさいに考慮しなければならない細則について書きました。
その2では実際に文字列から数値へ変換をおこなっていきます。
0 件のコメント:
コメントを投稿