Scala で1年分のカレンダーを
"どう書く サイト" の
"n年の年間カレンダーを返すプログラムを作ってください"
に対する Scala での回答例 http://ja.doukaku.org/comment/5060/
を参考にして、自分なりのコードを書いてみた。
$ cat YearCalendar2.scala
// See http://ja.doukaku.org/comment/5060/
package scalaapplication
import java.text.DateFormatSymbols
import java.util.Locale
import java.util.Calendar
object Main extends Application {
val year = new YearCalendar2
Console.println(year.print(2009))
Console.println(year.print(2009, Locale.US))
Console.println(year.print(2009, Locale.CHINA))
}
class YearCalendar2 {
def selString(v:Int, width:Int) = ("%%%ds".format(width)).format(if(v == 0) "." else v.toString)
def print(year:Int):String = print(year, Locale.getDefault)
def print(year:Int, locale:Locale):String = {
val monthSyms = new DateFormatSymbols(locale).getMonths
val weekSyms = (new DateFormatSymbols(locale)).getShortWeekdays
val selWidth = 1 + (if (locale == Locale.JAPAN) 2 else if (locale == Locale.CHINA) 6 else 3) // weeks(1).getBytes.length
val cal = Calendar.getInstance(locale)
var ans = (locale.getDisplayCountry) + "\n" // 国の名前
for (month <- cal.getActualMinimum(Calendar.MONTH) to cal.getActualMaximum(Calendar.MONTH)) {
cal.set(year, month, 1)
ans += (year + " / " + monthSyms(month) + "\n") // 月の名前
ans += (weekSyms.mkString(" ")+ "\n") // 曜日の名前
val maxDay = cal.getActualMaximum(Calendar.DATE)
val w = cal.get(Calendar.DAY_OF_WEEK)
for (_ <- 1 to w - 1) { ans += (selString(0, selWidth)) } // 先頭の空白セル
for (d <- 1 to maxDay; dw = d + w - 1) {
ans += (selString(d, selWidth) +
(if ((dw % 7 == 0) && (d != maxDay)) "\n" else ""))
}
ans += ("\n")
}
ans
}
}
39 行と少し長くなってしまったが。
# 曜日の名前の文字列の表示長さを得る部分は、どう書くにある方法は私の環境ではうまく動作しなかった。
# でも他の良い方法もわからなかったので、個別対応してしまっている orz...
実行結果はこんな感じ。(等幅フォントでないとレイアウトが崩れる表示される...)
日本
2009 / 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
2009 / 2月
日 月 火 水 木 金 土
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
...
アメリカ合衆国
2009 / January
Sun Mon Tue Wed Thu Fri Sat
. . . . 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
...
2009 / 十二月
星期日 星期一 星期二 星期三 星期四 星期五 星期六
. . 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
« ピックアップ:和製スパコンに267億円の予算復活, Twitterでの最新の発言をブログ等に表示する方法, etc... | トップページ | ピックアップ:AndroidとChrome OSはいずれ統合される, スティーブ・ジョブズからのメールはやたら短く簡潔だった, etc... »
この記事へのコメントは終了しました。
« ピックアップ:和製スパコンに267億円の予算復活, Twitterでの最新の発言をブログ等に表示する方法, etc... | トップページ | ピックアップ:AndroidとChrome OSはいずれ統合される, スティーブ・ジョブズからのメールはやたら短く簡潔だった, etc... »
コメント