ついに、2019年5月から使われる新しい元号「令和」が発表されました。新しい元号発表に日本中が注目しました。そこで、いち早く「令和」に対応した和暦西暦変換ツールを作ってみましょう。西暦を入力すると和暦を表示するプログラム、またその逆で、和暦を入力すると西暦を表示するプログラムも作ってみます。

西暦和暦変換ツールの仕組みは?

それでは、最初に西暦をどのように和暦に変換するのかを考えてみましょう。と言っても簡単です。西暦からその和暦の開始年を引いて1を足すだけです。

[西暦から和暦への変換式]
和暦年 = 西暦年 - 和暦開始年 + 1

そのため、開始年と終了年の変換表を用意して、一つずつ西暦を確認していくことになります。令和の終了年は分からないので、9999を設定しています。以下に変換表をCSV形式で用意しました。このCSVの表を利用して西暦を和暦に変換します。

和暦, 略号, 開始年, 終了年
明治, M, 1868, 1912
大正, T, 1912, 1926
昭和, S, 1926, 1989
平成, H, 1989, 2019
令和, R, 2019, 9999

西暦から和暦への変換プログラム

それでは、プログラムを作ってみましょう。以下のプログラムが、西暦から和暦への変換プログラムです。プログラムをコピーして、なでしこ簡易エディタで実行してみましょう。

※──────────────────────────
※  西暦和暦変換ツール
※──────────────────────────
「西暦を入力」と尋ねて、Yに代入。# --- (*1)
W=Yを西暦和暦変換処理。
「西暦{Y}年 = {W}」と言う。

# 関数の定義 --- (*2)
●(Yを)西暦和暦変換処理とは
  和暦CSV=『和暦, 略号, 開始年, 終了年
明治, M, 1868, 1912
大正, T, 1912, 1926
昭和, S, 1926, 1989
平成, H, 1989, 2019
令和, R, 2019, 9999』# --- (*3)
  和暦表=和暦CSVをCSV取得。
  Y=Yを英数半角変換。
  和暦表を反復
    # 表から値を取り出す
    和暦名=それ[0]
    開始年=それ[2]
    終了年=それ[3]
    # 指定した西暦に該当するか調べる --- (*4)
    もし(開始年≦Y)かつ(Y<終了年)ならば
      V=Y - 開始年 + 1
      もし、V=1ならば、V=「元」
      「{和暦名}{V}年」で戻る。
    ここまで。
  ここまで。
  「不明」で戻る。
ここまで。

プログラムを実行すると西暦年を聞かれますので「2019」などと入力して、[OK]ボタンをクリックしてみましょう。すると、和暦に変換して表示されます。

  • 西暦から和暦への変換ツール

    西暦から和暦への変換ツール

プログラムを見てみましょう。(*1)では『尋ねる』命令を使ってユーザーから値を入力します。次に、(*2)の部分では、『西暦和暦変換処理』という名前の関数を定義します。このようにして、関数にまとめておけば、コピー&ペーストして、別のプログラムでも流用することができます。

そして、(*3)の部分で、和暦と西暦の対応CSVデータを指定しています。その後、なでしこの配列に変換するように『CSV取得』命令を使います。その後、『反復』命令を使って、一つずつどの和暦に対応するのか確認します。(*4)の部分では、西暦を指定した変数Yが、開始年以上、終了年未満かを判定します。

和暦から西暦への変換ツールを作ってみよう

次に、先ほどとは逆で、和暦から西暦に変換するプログラムを作ってみましょう。こちらは、CSVの表から該当する和暦の表記を検索して、開始年を用いて値を計算します。そのため、計算式は以下のようになります。

[和暦から西暦年への変換式]
西暦年 = 和暦年 + 和暦開始年 - 1

それでは、これをプログラムしてみましょう。以下のプログラムを、なでしこ簡易エディタに貼り付けて実行してみましょう。

※──────────────────────────
※  和暦西暦変換ツール
※──────────────────────────
「和暦を入力してください。
(例: 平成30年、H30)」と尋ねてWに代入。# --- (*1)
S=Wを和暦西暦変換処理。
「{W}は{S}年です!」と言う。

# 関数の利用例
#「令和元年」を和暦西暦変換処理して表示。
#「H30」を和暦西暦変換処理して表示。

# 関数の定義 --- (*2)
●(Wを)和暦西暦変換処理とは
  和暦CSV=『和暦, 略号, 開始年, 終了年
明治, M, 1868, 1912
大正, T, 1912, 1926
昭和, S, 1926, 1989
平成, H, 1989, 2019
令和, R, 2019, 9999』
  和暦表=和暦CSVをCSV取得。
  # 前置処理 --- (*3)
  W=Wの「元年」を「1年」に置換。
  W=Wを英数半角変換。
  Wを「/\d+/」で正規表現マッチして和暦年に代入。
  もし、それがNULLならば、「不明」で戻る。
  # 各和暦を繰り返し調べる --- (*4)
  和暦表を反復
    # 表から値を取り出す
    和暦名=それ[0]
    略号=それ[1]
    開始年=それ[2]
    W=Wの略号を和暦名に置換。
    和暦=Wで和暦名が何文字目 # --- (*5)
    もし(それ>0)ならば
      西暦=和暦年+開始年−1
      西暦で戻る。
    ここまで。
  ここまで。
  「不明」で戻る。
ここまで。

プログラムを実行し、「令和元年」あるいは「R1」と入力して[OK]ボタンを押すと、2019年と表示されます。

  • 和暦から西暦に変換します

    和暦から西暦に変換します

それでは、プログラムを確認してみましょう。(*1)の部分では、ユーザーに和暦を入力してもらいます。(*2)の部分では、和暦表記を西暦に変換する関数を定義します。(*3)では和暦を記述した際の表記の揺れを吸収する置換処理を行います。まず、計算が楽になるように、「元年」の表記を1に変換します。次に『英数半角変換』命令を使って、全角で数字や和暦の略号を入力した際にも問題なく対応できるように変換します。(*4)の部分では和暦表を繰り返し調べます。そして、(*5)の部分で合致する和暦があるかどうかを調べます。

明治以前の和暦にも対応することは可能?

可能です。あまり利用する機会はないかもしれませんが、上記の二つのプログラムの変数『和暦CSV』の値を書き換えることで、明治以前の年号にも対応することができます。以下は、江戸時代の『文久』『元治』『慶応』に対応する和暦CSVです。

和暦CSV=『文久,*,1861,1864
元治,*,1864,1865
慶応,*,1865,1868
明治, M, 1868, 1912
大正, T, 1912, 1926
昭和, S, 1926, 1989
平成, H, 1989, 2019
令和, R, 2019, 9999』

まとめ

以上、今回は、新年号に対応した和暦西暦変換プログラムを作ってみました。和暦と西暦の対応表さえ用意してしまえば、手軽に変換ツールを作成できることが分かりました。その際のポイントは『反復』構文を利用して、一つずつ和暦を確認して判定する部分です。

また、今回は年号の変換を行うプログラムですが、商品の見積もり書など難しい計算が必要な場面でも、変換表などを用意すれば、簡単なプログラムで変換できます。本稿を参考に自作の見積もりツールを作るのも面白いと思います。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。