image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« ピックアップ:和製スパコンに267億円の予算復活, Twitterでの最新の発言をブログ等に表示する方法, etc... | トップページ | ピックアップ:AndroidとChrome OSはいずれ統合される, スティーブ・ジョブズからのメールはやたら短く簡潔だった, etc... »

2009-11-24

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... »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/184434/46850384

この記事へのトラックバック一覧です: Scala で1年分のカレンダーを:

« ピックアップ:和製スパコンに267億円の予算復活, Twitterでの最新の発言をブログ等に表示する方法, etc... | トップページ | ピックアップ:AndroidとChrome OSはいずれ統合される, スティーブ・ジョブズからのメールはやたら短く簡潔だった, etc... »

mokuji

2013年12月
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        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク