大復活C#学習_和暦を使う

f:id:yasui_swift:20210211055515p:plain

和暦から西暦と年齢を求める

和暦から西暦を求めるプロジェクトを作成した。

西暦から和暦を求めることも作ってみたが、フォームを作ったときには表示することにする。

今回は基本となる和暦から西暦を求め、満年齢を計算するプログラムを記載する。

使用するクラスにusing System.Globalizationを追加。

System.Globalization.Cultureinfoは各地の文化(カルチャ)固有の情報を扱うためのクラスで、カルチャ名に"ja-JP"を指定してインスタンス化すると「日本語の日本」を指定したことになる。

西暦を和暦に変換するには、DateTimeFormat.CalendarプロパティにJapaneseCalendarクラスのインスタンスを設定する。

今日の日付はDateTime.Todayで求める。

繰り返しは、While(true)を用いて、終了は<Enter>の入力とした。

例外処理は、try{}、catch{}を用いた。goto label を使いたかったが、教科書では使うべきではないと書いてあった。同じメソッドのなかであればlabelがどこにあるかすぐにわかるのでスパゲッティになりにくいと思うが行儀よくtry、catchにしてみた。

追記:干支を計算するほうが面白いので、フォームで作る時は追加することにする。専用のクラスがあるようだ(JapaneseLunisolarCalendarクラス)。

*************************

using System;
using System.Globalization; //使用するクラス

namespace AgeTest1
{
class Program
{
static void Main()

{
//DateTimeを使う
Console.WriteLine();
CultureInfo culture = new CultureInfo("ja-JP", true);
culture.DateTimeFormat.Calendar = new JapaneseCalendar();

Console.WriteLine("==================CUIで基本プログラミング==================");

DateTime today = DateTime.Today; //今日の日付

//------------CUI for Form Program-------------

Console.WriteLine("=================フォーム準備のためのCUI=====================");
Console.WriteLine();
Console.WriteLine(" 元号は漢字で入力、年月は数字で入力");
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("===========================================================");

while (true)
{
try
{
string genGo;
string nenYear;
string getuMonth;
string nichiDay;

Console.Write(" 元号 = ");
genGo = Console.ReadLine();

if (genGo == "") // 繰り返しの終了
{ return; }

Console.Write(" 年  = ");
nenYear = Console.ReadLine();
Console.Write(" 月  = ");
getuMonth = Console.ReadLine();
Console.Write(" 日  = ");
nichiDay = Console.ReadLine();
Console.WriteLine();

string nenGappi = genGo + nenYear + "/" + getuMonth + "/" + nichiDay;

Console.WriteLine(" ⇒ 入力の確認:  " + genGo + nenYear + "年" + getuMonth + "月" + nichiDay + "日");

DateTime finalDate = DateTime.Parse(nenGappi, culture.DateTimeFormat);
//Console.WriteLine(" ⇒ 西暦変換後の出力 = " + finalDate);//出力は1950/11/16 0:00:00
Console.WriteLine(finalDate.ToString(" ⇒ 西暦 yyyy年MM月dd日"));//月は大文字

//誕生日の日付から年齢を計算する

int ageOld = today.Year - finalDate.Year;//満年齢の計算
if (finalDate > today.AddYears(-ageOld)) //年齢の修正
ageOld--;

Console.WriteLine();
Console.WriteLine();
Console.WriteLine($" 年齢:満{ageOld}歳");
Console.WriteLine();
Console.WriteLine("=======================終了時は<Enter>=====================");
Console.WriteLine();

}
catch
{
Console.WriteLine();
Console.WriteLine(" ⇒ 入力に誤りがあります");
Console.WriteLine();
}
}
}
}
}