スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

m番目のn曜日

仕事でサマータイムについて考える事があった。
夏時間
ある日ある時間を境に、1時間進んでみたり戻ってみたりするという奴だ。
ヨーロッパの実施時間をWikiから引用すると

3月最終日曜日午前1時〜10月最終日曜日午前1時(UTC基準)

となっている。この「最終日曜日」というの具体性(明確な日付)のない規定がプログラミングでは曲者だった。
C#のDateTimeは通常、各現地のローカル時間を扱う。サマータイムを実施していない日本ではなーんの考慮も要らないんだけど、実施している地域が絡むとめんどくさい話になる。サマータイムを使った計算云々は、仕事上やむを得ず実装した特殊なケースなので載せることもないんだけど、「m番目のn曜日」を日付に変えるという処理は、共通的に使えそうなので実装したコードをメモっておく。
using System;

namespace TawamureDays {

public static class Utils {

/// <summary>
/// 指定日付が属する月の、[weekNumber]番目の曜日(weekDay)
/// に当たる日付を取得します。<br/>
/// 指定日付から、数えて…というわけではありません。<br/>
/// </summary>
/// <param name="date">指定日付</param>
/// <param name="weekNumber">指定週(大体1~5)</param>
/// <param name="weekDay">曜日</param>
/// <returns>[weekNumber]番目の曜日(weekDay)に当たる日付]
///(時分秒は、dateのものを引き継ぎます)</returns>
public static DateTime GetDateByWeekNumber(this DateTime date,
int weekNumber, DayOfWeek weekDay) {

//月の月初日と月末日
var firstDay = date.FirstDayOfMonth();
var lastDay = date.LastDayOfMonth();
//0番目ってのはないよ?
var week = Math.Max(1, weekNumber);
var day = 0;

do {
//日付の計算(日曜=0, 土曜=6の時の計算式)
//月初日の曜日と、引数の曜日の大小関係で計算方法が変わります。
//日付が末日を超える限り計算を続けます。
if (weekDay >= firstDay.DayOfWeek) {
day = 7 * (week - 1) +
((int)weekDay - (int)firstDay.DayOfWeek) + 1;

} else {
day = 7 * week + ((int)weekDay - (int)firstDay.DayOfWeek) + 1;
}

week --;

} while (day > lastDay.Day);

return new DateTime(firstDay.Year, firstDay.Month, day,
date.Hour, date.Minute, date.Second);
}
}
}

FirstDayOfMonthメソッドとLastDayOfMonthメソッドも載せておく。
/// <summary>
/// 指定された日付の月初日を取得します<br/>
/// </summary>
/// <param name="date">日付</param>
/// <returns>月初日</returns>
public static DateTime FirstDayOfMonth(this DateTime date) {
return new DateTime(date.Year, date.Month, 1);
}

/// <summary>
/// 指定された日付の月末日を取得します<br/>
/// </summary>
/// <param name="date">日付</param>
/// <returns>月末日</returns>
public static DateTime LastDayOfMonth(this DateTime date) {
return date.FirstDayOfMonth().AddMonths(1).AddDays(-1);
}
見ればわかるので説明は省略。
使い方はこんな感じ。

//最後の日曜日を取得しよう。
var lastSunday = DateTime.Today.GetDateByWeekNumber(5, DayOfWeek.Sunday);
これを書いた2013年3月なら、lastSundayは「2013/03/31」となる。

//最初の日曜日を取得しよう。
var firstSunday = DateTime.Today.GetDateByWeekNumber(1, DayOfWeek.Sunday);
これを書いた2013年3月なら、lastSundayは「2013/03/3」となる。
「第3日曜からxxxxする」とか、「第1,3月曜はxxxxしない。」という条件があるときには使えるかな。
続きを読む
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

数値入力用のDataGridColumnも欲しくなる。

数値だけのTextBoxだってやれるはずだ(壱)
数値だけのTextBoxだってやれるはずだ(弐)
数値だけのTextBoxだってやれるはずだ(参)
数値だけのTextBoxだってやれるはずだ(四)
で、TextBoxに数値専用の機能(添付プロパティ)を実装した。でも、開発する画面によっては、DataGrid内の列に対して直接編集をするような事もある。当たり前のように、金額や数量の様に、数値のみ入力を許可したい要件というものが出てくる。どんなご時世だろうと、ユーザさんの中にはパソコンに対するアレルギーを持っている人もいるので、できるだけ入力ミスをさせない(できない)ように作ることもそれなりに大切なんだ。
数値入力専用のDataGridColumnなので、

○表示や編集時、右詰めで表示する。
○アルファベットやカナ等、数値と記号(マイナス(-)やドット(.))以外の入力をさせない。

という感じで作る事にする。
右詰め表示については、↓の記事で書いていたので、これと同じような方法で実装してみる。
DataGridTextColumnで右詰めにしたい時が多々ある。

続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

欲しいとは思ったものの


Hacoa 木ーボード Kit ウォールナット H901K-WHacoa 木ーボード Kit ウォールナット H901K-W
(2007/11/10)
Windows

商品詳細を見る

欲しい!と一瞬思ったけど、よく考えたら、家のはノートだったOrz。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: 物欲 | コメント: 0 | トラックバック: 0

Minus is red.

仕事上でよく扱うのが数値(Only)の項目。なので、数値だけのTextBoxだってやれるはずだ(四)みたいなのを考える訳なんだけども。
この数値系でよくあるのが、「マイナス値は赤文字で表示したい」というやつ。仕事上、マイナスになるような数値はあまりよろしくないことが多い。赤字だったり返品だったりする。且つあまり頻度の高いものではない。なので、通常の正の数とは明確に違うように視覚的に見えるようにしておきたい。
こういうネタは、視覚的(ビュー)な話なので、WPFでやるなら、コードビハインド(やViewModel)ではなく、XAML内で片付ける(片付けたい)話になると思った。
そこで、Style.Triggerの出番となるわけだ。わけなんだけど。今回の動作を言葉にすると、

「Textプロパティの値が、マイナスの(0より小さい)時、文字色(Foreground)を赤色にする」

となる。この「0より小さい」というのが曲者であった。普通、Style.Triggerは、

「対象のプロパティ値が、指定した値に等しい時、○○する」

という動作になるので、この「0より小さい時」というのを「0より小さいという事が真(true)の時」みたいな扱いにする必要がある。まあ、こういう時に頼りになるのが、Converterだ。Converterは、ある値(バインディングソース)を別の値に変換する(ターゲットに渡す)のに使われる。今回は、「数値(decimal)→bool値(マイナスならTrue)」となるConverterクラスを作る事が目的なんだけど、どうせなら、他の不等号式にも応用できるようにする。続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 2 | トラックバック: 0

数値だけのTextBoxだってやれるはずだ(四)

数値だけのTextBoxだってやれるはずだ(参)に書いた「追加の制限」をメソッド化しておく。メインの目的は、設定された、桁数や最大最小値の条件をみたすかどうかのチェックとなる。チェックに使うのは、正規表現がかなり使い勝手が良い。C#にもそこらへんは標準でサポートされているので、その当たりに困る事はない。
/// <summary>
/// 指定の文字列の妥当性を検証します。
/// </summary>
/// <param name="textBox">TextBox</param>
/// <param name="checkedText">検証対象となる文字列</param>
/// <returns>true:妥当</returns>
public static bool VerifyValue(TextBox textBox, string checkedText) {

if (checkedText == null) {
return true;//管轄外
}

//最大/最小ペア
//桁数ペア
//マイナスを許可するか?
//整数部桁数
var integerPartDigit = TextBoxBehavior.GetIntegerPartDigit(textBox);
//小数部桁数
var decimalPartDigit = TextBoxBehavior.GetDecimalPartDigit(textBox);

//マイナスで始まる1文字以上の文字列
var regStr = new System.Text.StringBuilder("^-?");
//数字(0~9)
regStr.Append("[0-9]");

if (integerPartDigit > 0) {
//整数部桁数に合わせて、数字の数を決める
regStr.Append("{0," + integerPartDigit.ToString() + "}");
} else {
//整数部桁数に指定がなければ、任意の数
regStr.Append("*");
}

if (decimalPartDigit > 0) {
//小数部桁数に合わせて正規表現を組み立てる
var temp = new System.Text.StringBuilder("(" + regStr + @"\z)|");
temp.Append("(" + regStr + @"\.{1}[0-9]{0," + decimalPartDigit + @"})\z");
regStr = temp;
} else {
regStr.Append(@"\z");
}

if (!System.Text.RegularExpressions.Regex.IsMatch(checkedText, regStr.ToString())) {
//組み立てた正規表現にマッチするかどうかを確認する。
//マッチしないなら、NGとする。
return false;
}

//decimal型に変換する。
decimal number = decimal.Zero;

if (!decimal.TryParse(checkedText, out number)) {
return false;
}

//最大値と最小値
var maxValue = TextBoxBehavior.GetMaxValue(textBox);
var minValue = TextBoxBehavior.GetMinValue(textBox);

//最大値が設定されていて、その値を超えるときはNG
if (maxValue.HasValue && maxValue.Value < number) {
return false;
}

//最小値が設定されていて、その値を切るときはNG
if (minValue.HasValue && minValue.Value > number) {
return false;
}

return true;
}

こんなもんかな。後はこれを応用していくだけかな。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。