Javaでカレンダーを作りたいです
受付中
回答 3
投稿
- 評価
- クリップ 0
- VIEW 1,651
前提・実現したいこと
1,キーボードで"yyyy/MM"の形式で年と月を入力
2,yyyy/MMで入力された数字をyyyy/MMで出力
現在は入力する際、
yyyy
MM
のような形で入力する方法しかわからない状態です、
キーボードでyyyy/MMの形式で入力する方法で何かいいやり方はありませんでしょうか。
また、2点目ですが、キーボードからMM(例:03)と入力しても
頭に0か付かずに出力されてしまいます。
こちらも解決法を教えて頂けると幸いです。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
package calendar;
import java.util.Calendar;
import java.util.Scanner;
public class Mycalendar {
public static void main(String[] args) {
java.util.Calendar cal = java.util.Calendar.getInstance();
System.out.println("カレンダーを表示したい年月をYYYY/MMで指定してください");
Scanner scan = new Scanner(System.in);
int year = scan.nextInt();
int month = scan.nextInt();
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ) {
System.out.println(" ");
System.out.println(year + "/" + month + "(うるう年)");
System.out.println(" ");
System.out.println("日 月 火 水 木 金 土");
System.out.println("---------------------");
} else {
System.out.println(" ");
System.out.println(year + "/" + month);
System.out.println(" ");
System.out.println("日 月 火 水 木 金 土");
System.out.println("---------------------");
}
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month -1);
cal.set(Calendar.DATE, 1);
int week = cal.get(java.util.Calendar.DAY_OF_WEEK);
int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);
int counter = 0;
for (int i = 1; i < week ; i ++) {
System.out.print(" ");
counter ++;
}
for (int day = 1 ; day <= lastDay; day ++) {
if (day < 10) { // ズレ
System.out.print(" " + day + " ");
} else {
System.out.print( day + " ");
}
counter ++;
if (counter == 7) { // 7日ごとに下段に
counter = 0;
System.out.println();
}
}
}
}
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
nextInt
メソッドの場合、入力したトークンを整数で取得してしまうので、
"yyyy/MM"の形式
で取得したい場合はnext
メソッドで文字列を取得してください。
2点目ですが、キーボードからMM(例:03)と入力しても頭に0か付かずに出力されてしまいます。
int
は整数型なので、先頭に0はつけられません。
やはりこちらも文字列にして取得しなければいけません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
キーボードでyyyy/MMの形式で入力する方法で何かいいやり方はありませんでしょうか。
一行丸々読み込んでからスラッシュで分割し、それぞれ数値化すれば良いです。
次のメソッドについてそれぞれ調べてみると良いでしょう。
- Scanner#nextLine
- String#split
- Integer.valueOf
2点目ですが、キーボードからMM(例:03)と入力しても
頭に0か付かずに出力されてしまいます。
数値化した時点で不要な情報は削ぎ落とされているのです。
System.out.printfを使うと便利です。
例えば0埋め2ケタの数値なら、次のように使います。
System.out.printf("%02d", day);
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
Scanner には, 分割するパターンを指定できる useDelimiter があります.
package calendar;
import java.util.Calendar;
import java.util.Scanner;
import static java.util.Calendar.*;
public class Mycalendar {
public static void main(String[] args) {
System.out.println("カレンダーを表示したい年月をYYYY/MMで指定してください");
Scanner scan = new Scanner(System.in).useDelimiter("/");
int year = scan.nextInt();
int month = scan.nextInt() - 1; //月は 0 始まりとする
Calendar cal = Calendar.getInstance();
cal.set(YEAR, year);
cal.set(MONTH, month);
cal.set(DATE, 1);
System.out.println();
System.out.println(year + "/" + (month+1) + (((java.util.GregorianCalendar)cal).isLeapYear(year)?"(うるう年)":"") );
System.out.println();
System.out.println("日 月 火 水 木 金 土");
System.out.println("---------------------");
cal.add(DATE, SUNDAY-cal.get(DAY_OF_WEEK)); //1日が属する週の日曜日の日付. ex)2019/5/1→2019/4/28
for (; cal.get(MONTH) <= month; cal.add(DATE, 1)) {
System.out.printf(cal.get(MONTH)<month?" ":"%2d ", cal.get(DATE));
if (cal.get(DAY_OF_WEEK) == SATURDAY) System.out.println();
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
m.ts10806
2019/05/07 15:03
タイトルは質問要件(起きている問題)に寄せてください。