C#をつかって生年月日から年齢を計算するアプリをつくります。
年の上二桁と下二桁、月、日をコンボボックスで表示します。1ヵ月が何日かは月によって違うので、DropDownイベントをつかってドロップダウンされるときに適切な選択肢を挿入しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); comboBoxYear1.Items.Add("19"); comboBoxYear1.Items.Add("20"); for(int i=0; i<100; i++) comboBoxYear2.Items.Add(i.ToString("00")); for (int i = 0; i < 12; i++) comboBoxMonth.Items.Add((i+1).ToString()); for (int i = 0; i < 30; i++) comboBoxDay.Items.Add((i + 1).ToString()); comboBoxYear1.SelectedIndex = 0; comboBoxYear2.SelectedIndex = 80; comboBoxMonth.SelectedIndex = 0; comboBoxDay.SelectedIndex = 0; comboBoxDay.DropDown += ComboBoxDay_DropDown; } } |
コンストラクタ内でコンボボックスにアイテムを追加しています。
日を表示するコンボボックスがドロップダウンされるときに、年、月をしらべて、大の月か小の月か、閏年かどうかを確認して適切なアイテムを挿入しています。その月が、1月、3月、5月、7月、8月、10月、12月なら31日まで、4月、6月、9月、11月なら30日まで、2月は4の倍数の年(ただし1900年は閏年ではないので注意)は29日、それ以外の年は28日までです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class Form1 : Form { private void ComboBoxDay_DropDown(object sender, EventArgs e) { comboBoxDay.Items.Clear(); string month = comboBoxMonth.Text; if (month == "1" || month == "3" || month == "5" || month == "7" || month == "8" || month == "10" || month == "12") { for (int i = 0; i < 31; i++) comboBoxDay.Items.Add((i + 1).ToString()); } else if (month == "4" || month == "6" || month == "9" || month == "11") { for (int i = 0; i < 31; i++) comboBoxDay.Items.Add((i + 1).ToString()); } else if (month == "2") { int year1 = int.Parse(comboBoxYear1.Text); int year2 = int.Parse(comboBoxYear2.Text); if (!(year1 == 19 && year2 == 0) && year2 % 4 == 0) { for (int i = 0; i < 29; i++) comboBoxDay.Items.Add((i + 1).ToString()); } else { for (int i = 0; i < 28; i++) comboBoxDay.Items.Add((i + 1).ToString()); } } } } |
そしてボタンがクリックされたら今日の日付を取得してその人の年齢を計算しています。その年の誕生日を過ぎていれば現在年から生年をひけばいいし、まだであればさらに1を引くと年齢を知ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { int year1 = 0; int year2 = 0; int year = 0; int month = 0; int day = 0; try { year1 = int.Parse(comboBoxYear1.Text); year2 = int.Parse(comboBoxYear2.Text); year = year1 * 100 + year2; month = int.Parse(comboBoxMonth.Text); day = int.Parse(comboBoxDay.Text); } catch { MessageBox.Show("入力データが不正です"); return; } string resultString = String.Format("年齢は {0} 歳です", GetAge(year, month, day)); MessageBox.Show(resultString, FromChristianEra(year, month, day)); } int GetAge(int birthYear, int birthMonth, int birthDay) { // 誕生日は過ぎているか? DateTime today = DateTime.Today; bool passed = false; if (today.Month > birthMonth) passed = true; else if (today.Month < birthMonth) passed = false; else { if (today.Day >= birthDay) passed = true; else passed = false; } int age = 0; if (passed) age = today.Year - birthYear; else age = today.Year - birthYear - 1; return age; } } |
西暦から年号を求めるメソッドです。新年号と旧年号の最後の年が同じ年になるので月日で判断をする必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public partial class Form1 : Form { string FromChristianEra(int year, int month, int day) { if (year - 2018 > 1) { return "令和" + (year - 2018) + "年"; } if (year - 2018 == 1) { if(month >= 5) return "令和" + (year - 2018) + "年"; else return "平成" + (year - 1988) + "年"; } if (year - 1988 > 1) { return "平成" + (year - 1988) + "年"; } if (year - 1988 == 1) { if (month >= 2 || (month == 1 && day >=8)) return "平成" + (year - 1988) + "年"; else return "昭和" + (year - 1925) + "年"; } if (year - 1925 > 1) { return "昭和" + (year - 1925) + "年"; } if (year - 1925 == 1) { if (month >= 12 && day >= 25) return "昭和" + (year - 1925) + "年"; else return "大正" + (year - 1911) + "年"; } if (year - 1911 > 1) { return "大正" + (year - 1911) + "年"; } if (year - 1911 == 1) { if (month >= 8 || (month == 7 && day >= 30)) return "大正" + (year - 1911) + "年"; else return "明治" + (year - 1867) + "年"; } if (year - 1867 > 1) { return "明治" + (year - 1867) + "年"; } if (year - 1867 == 1) { if (month >= 11 || (month == 10 && day >= 23)) return "明治" + (year - 1867) + "年"; else return "慶応以前"; } return "慶応以前"; } } |