本文へ移動

Hikidashi引き出し

和暦と漢数字の相互変換、活用した語の辞書形、漢字への読みの割り当て、貼り付けた文からの単語の抽出、文の難しさ。日本語のテキストを扱う小さな道具を集めた引き出しです。

「引き出し」という名前は、道具が一つずつしまってあり、必要なときに取り出して使える、という意味です。 名前について(英語)

目次

やり方

フォームで元号の年を読む

人が入力するとおりの年を、和暦でも西暦でも受け付け、西暦の年として保存します。

生まれた年を尋ねる入力フォームがあるとします。1985と入力する人もいれば、昭和60年、「Showa 60」、あるいは元号をリストから選んで 60 と入力する人もいます。この手順では、そのどれを受け取っても、西暦の年という一つの数にまとめ、表示し直すための元号の年も添えます。

入力されたものをそのまま受け取る

まず元号の年として読み、読めなければ普通の数として読みます。どの段階も、当てはまらなければnullを返すので、この順番がそのまま処理のすべてです。

import { eraYearOf, formatEraYearJapanese, parseEraYear } from "@johnmorrisdotca/hikidashi/wareki";
import { parseJapaneseNumber } from "@johnmorrisdotca/hikidashi/numerals";

function readYear(typed: string): { western: number; shown: string } | null {
  const era = parseEraYear(typed);
  if (era !== null) return { western: era.westernYear, shown: formatEraYearJapanese(era) };
  const western = parseJapaneseNumber(typed);
  if (western === null || western < 1868 || western > 2100) return null;
  const asEra = eraYearOf(western);
  return { western, shown: asEra === null ? String(western) : formatEraYearJapanese(asEra) };
}

console.log(readYear("昭和60年"));    // { western: 1985, shown: "昭和60年" }
console.log(readYear("Showa 60"));    // 同じ
console.log(readYear("1985"));     // 全角数字からでも同じ
console.log(readYear("昭和65年"));    // null:そのような年はなかった
{ western: 1985, shown: '昭和60年' }
{ western: 1985, shown: '昭和60年' }
{ western: 1985, shown: '昭和60年' }
null

普通の数として読むときの範囲(1868〜2100)は、このフォームの決まりで、パッケージの決まりではありません。Hikidashiはどんな整数でも読み取ります。

元号をリストから選ぶ場合

元号を<select>で、年を入力欄で受け取るときは、JAPANESE_ERASから元号を探してwesternYearForに渡します。その元号に存在しなかった年にはnullが返るので、それを入力欄の横に表示するエラーにします。

import { JAPANESE_ERAS, westernYearFor } from "@johnmorrisdotca/hikidashi/wareki";

const options = JAPANESE_ERAS.map((era) => ({ value: era.romaji, label: `${era.kanji}(${era.romaji})` }));
console.log(options.map((option) => option.label).join("、"));

const picked = JAPANESE_ERAS.find((era) => era.romaji === "Heisei")!;
console.log(westernYearFor(picked, 31), westernYearFor(picked, 32));    // 2019 null
明治(Meiji)、大正(Taisho)、昭和(Showa)、平成(Heisei)、令和(Reiwa)
2019 null

年ではなく日付の場合

改元のあった年は二つの元号にまたがるので、年だけでは、1989年のある日がどちらの元号かは分かりません。フォームに日付まであるときはeraOnDateを使います。

import { eraOnDate, formatEraYearJapanese } from "@johnmorrisdotca/hikidashi/wareki";

for (const day of ["1989-01-07", "1989-01-08", "2019-04-30", "2019-05-01"]) {
  const found = eraOnDate(day);
  console.log(day, found === null ? "日付ではない" : formatEraYearJapanese(found, { gannen: true }));
}
1989-01-07 昭和64年
1989-01-08 平成元年
2019-04-30 平成31年
2019-05-01 令和元年

Dateも渡せます。その場合は、Dateがそれ自身のタイムゾーン(利用者が選んだタイムゾーン)で示す日付として読みます。1868年10月23日より前の日付はnullです。このパッケージの元号は明治から始まります。

表示し直す

元号の年を、日本の書類と同じように最初の年を元年として書き、西暦も添えます。

import { eraYearsOf, formatEraYearJapanese, formatEraYearRomaji } from "@johnmorrisdotca/hikidashi/wareki";

const both = eraYearsOf(2019);
console.log(both.map((one) => `${formatEraYearJapanese(one, { gannen: true })}(${formatEraYearRomaji(one)})`).join(" / "), "= 2019");
令和元年(Reiwa 1) / 平成31年(Heisei 31) = 2019

関連項目:答えが二つある年についてはeraYearsOf、一つの年が二つの元号にまたがる理由については元号の年の仕組みを見てください。

ソースを見るGitHub で編集@johnmorrisdotca/hikidashi 1.1.0 のソースから作成しました。

この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。