質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

7084閲覧

和暦を西暦に変換するプログラムを作りたい(メソッド不使用)

Alex_M

総合スコア32

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/06/22 13:58

編集2020/06/22 16:02

前提・実現したいこと

キーボードから元号・年・月・日付を取得して、
アメリカ式の表示で返したいです。

例)
令和 2(年) 6(月) 22(日) 
June 22th, 2020

平成 21(年) 7(月) 22(日)
July 22th, 2000

またメソッド(datetimeなど)は使用しません。
(ここでは使用できませんが、もし和暦を西暦にするのに使えるメソッド、利用できるメソッドがあればご教授ください。)
追記:(閏年は考慮しません)

発生している問題・エラーメッセージ

大まかなプログラムは記述したのですが、

昭和64年は1月7日まで、それ以降は平成、
平成31は4月30日まで、それ以降は令和

というような境界部分の記述ができておらず、

たとえば 存在しないはずの 「昭和64年2月1日」 と入力すると

February 1st, 1989

と出力できてしまいます。(本来ならば1989年は2月1日から平成と入力しなければならない)

該当のソースコード

Python

1month = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 6:"June", 7:"July", 8:"August", 9:"September", 10:"October", 11:"November", 12:"December"} 2head_days = {1:"1st", 2:"2nd", 3:"3rd"} 3showa = {} 4a = 1925 5for i in range(64): 6 a = a + 1 7 showa[ i + 1 ] = a 8heisei = {} 9b = 1988 10for i in range(31): 11 b = b + 1 12 heisei[ i + 1 ] = b 13reiwa = {} 14c = 2018 15for i in range(10): 16 c = c + 1 17 reiwa[ i + 1 ] = c 18 19ja_age = input("元号を入力してください(昭和、平成、令和)") # 元号を入力 20 21if ja_age == "昭和": 22 year = input("年を入力してください(昭和何年?)") 23 if 1 <= int(year) <= 64: 24 output_year = showa[int(year)] 25 else: 26 print("エラー:昭和は1~64年で入力してください") 27elif ja_age == "平成": 28 year = input("年を入力してください(平成何年?)") 29 if 1 <= int(year) <= 31: 30 output_year = heisei[int(year)] 31 else: 32 print("エラー:平成は1~31年で入力してください") 33elif ja_age == "令和": 34 year = input("年を入力してください(令和何年?)") 35 if 1 <= int(year) <= 10: 36 output_year = reiwa[int(year)] 37 else: 38 print("エラー:令和は1~10年で入力してください") 39else: 40 print("エラー:昭和、平成、令和のいずれかを入力してください") 41 42ja_month = input("月を入力してください") # 月を入力 43ja_int_month = int(ja_month) 44 45ja_day = input("日付を入力してください") # 日付を入力 46ja_int_day = int(ja_day) 47 48if ja_int_month == 1 or ja_int_month == 3 or ja_int_month == 5 or ja_int_month == 7 or ja_int_month == 8 or ja_int_month == 10 or ja_int_month == 12: # 1,3,5,7,8,10,12月の時 49 output_month = month[ja_int_month] 50 if 1 <= ja_int_day <= 3: 51 output_day = head_days[ja_int_day] 52 print( str(output_month) + " " + output_day + ", " + str(output_year)) #出力 53 elif not 4 <= ja_int_day <= 31 : 54 print("エラー:" + ja_month + "月の日付には1〜31の数値を入力してください") 55 else: 56 print( str(output_month) + " " + ja_day + "th, " + str(output_year)) #出力 57 58elif ja_int_month == 4 or ja_int_month == 6 or ja_int_month == 9 or ja_int_month == 11: # 4,6,9,11月の時 59 output_month = month[ja_int_month] 60 if 1 <= ja_int_day <= 3: 61 output_day = head_days[ja_int_day] 62 print( str(output_month) + " " + output_day + ", " + str(output_year)) #出力 63 elif not 4 <= ja_int_day <= 30: 64 print("エラー:" + ja_month + "月の日付には1〜30の数値を入力してください") 65 else: 66 print( str(output_month) + " " + ja_day + "th, " + str(output_year)) #出力 67 68 69elif ja_int_month == 2: # 2月の時 70 output_month = month[ja_int_month] 71 if 1 <= ja_int_day <= 3: 72 output_day = head_days[ja_int_day] 73 print( str(output_month) + " " + output_day + ", " + str(output_year)) #出力 74 elif not 4 <= ja_int_day <= 28: 75 print("エラー:" + ja_month + "月の日付には1〜28の数値を入力してください") 76 else: 77 print(str(output_month) + " " + ja_day + "th, " + str(output_year)) #出力 78else: 79 print("エラー:月には1〜12の数値を入力してください")

(元号が間違ってても出力されるのはちょっと便利にも感じますが、、、)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/06/22 15:56

2月の最終日は、閏年の判定をして28日と29日に分けないとまずいのでは。
Alex_M

2020/06/22 16:01

閏年は今回考慮しません。 きちんと前置きしておくべきでした。 ご指摘ありがとうございます!
guest

回答2

0

質問の回答ではありませんが、処理を簡略化してみました。

py

1YEAR = { 2 '昭和': {i + 1: 1926 + i for i in range(64)}, 3 '平成': {i + 1: 1989 + i for i in range(31)}, 4 '令和': {i + 1: 2019 + i for i in range(10)}, 5} 6MONTH = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 6:"June", 7:"July", 8:"August", 9:"September", 10:"October", 11:"November", 12:"December"} 7DAY = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31} 8ORDINAL = {1:"st", 2:"nd", 3:"rd"} 9 10era = input("元号を入力してください(昭和、平成、令和)") 11if era not in YEAR: 12 print("エラー:昭和、平成、令和のいずれかを入力してください") 13 exit() 14 15year = int(input(f"年を入力してください({era}何年?)")) 16if year not in YEAR[era]: 17 print(f"エラー:{era}は1~{max(YEAR[era])}年で入力してください") 18 exit() 19 20month = int(input("月を入力してください")) 21if month not in MONTH: 22 print("エラー:月には1〜12の数値を入力してください") 23 exit() 24 25day = int(input("日付を入力してください")) 26if not 1 <= day <= DAY[month]: 27 print(f"エラー:{month}月の日付には1〜{DAY[month]}の数値を入力してください") 28 exit() 29 30print(MONTH[month], f"{day}{ORDINAL.get(day, 'th')},", YEAR[era][year])

投稿2020/06/22 18:41

編集2020/06/22 18:47
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alex_M

2020/06/22 23:43

回答ありがとうございます。 確かにやたら長くて無駄な記述が多いなとは思っていましたが、ここまで簡略化できるとは、、、!! 辞書内でforを回せるんですね。とても勉強になりました!!
guest

0

ベストアンサー

元号切替の境界チェックは、さすがに地道に実装していくしかないのではないですか?

python

1# テスト入力値 2ja_age = "昭和" 3year = 64 4ja_month = 1 5ja_int_day = 8 6# 昭和平成境界判定 昭和65年以降の入力値は事前にはじいているとする 7if ja_age == "昭和" and year == 64: 8 # 2月以降をはじく 9 if ja_month >= 2: 10 print("エラー") 11 # 1月は8日以降をはじく 12 if ja_month == 1 and ja_int_day >= 8: 13 print("エラー")

和暦西暦ライブラリはいくつかあります。
japanera
jeraconv

投稿2020/06/22 15:05

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alex_M

2020/06/22 15:39

やはりそうですか。。。 そこまで面倒臭いことでも無いので横着せずにきちんと書くことにします笑 ライブラリの紹介もありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問