数値だけの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