20220127のC#に関する記事は4件です。

【C#】文字列が半角英数字のみであるかを判定する

はじめに @ki_87 さんの[C#]バイト数と文字数の比較で、漢字とひらがなの入力を制限する 英数字のみを読んで、以前に私が担当していたシステムでも、前任者の方が同様の方法で入力文字列のチェックをしていたことを思い出しました。 入力文字列のチェックについては実装方法は1つではないと思うので、幾つかの方法を検討して実装してみました。 仕様 入力文字列が「半角英数字のみ」で構成されているかをチェックします。 「半角英数字のみ」であればtrue、そうでなければfalseを返します。 英字については、大文字と小文字のどちらでも使えるものとします。 「半角英数字のみ」なので、全角文字は許可しません。 実装方法 文字数とバイト数を比較する方法 @ki_87 さんの方法は「文字列の文字数とバイト数を比較する」というもので、記事ではShift_JISと書かれていたのでそのままの仕様で実装してみました。 コメントが無いと、何のためにバイト数と文字数を比較しているのかが分からなくなりそうな感じを受けます。 例えば「_」のような半角記号も1バイトなので、文字数とバイト数を比較するだけでは半角記号を除去できないという欠点が内在しています。 TextChecker.cs using System.Text; namespace CSharpStudy.Text { public class TextChecker { /// <summary> /// 引数の文字列が半角英数字のみで構成されているかを調べる。 /// </summary> /// <param name="text">チェック対象の文字列。</param> /// <returns>引数が英数字のみで構成されていればtrue、そうでなければfalseを返す。</returns> public static bool IsOnlyAlphanumeric1(string text) { var enc = Encoding.GetEncoding("Shift_JIS"); // 「Shift_JISのバイト数=文字数」なら英数字のみとみなす。 return (enc.GetByteCount(text) == text.Length); } } } 正規表現を使った方法(1) 正規表現さえ読み解ければ、コメントが無くても半角英数字とマッチするかを判定していることが分かります。 コードも簡潔で半角記号の問題にも対応しているので、私ならこの実装方法を採用すると思います。 TextChecker.cs using System.Text.RegularExpressions; namespace CSharpStudy.Text { public class TextChecker { /// <summary> /// 引数の文字列が半角英数字のみで構成されているかを調べる。 /// </summary> /// <param name="text">チェック対象の文字列。</param> /// <returns>引数が英数字のみで構成されていればtrue、そうでなければfalseを返す。</returns> public static bool IsOnlyAlphanumeric2(string text) { // 文字列の先頭から末尾までが、英数字のみとマッチするかを調べる。 return (Regex.IsMatch(text, @"^[0-9a-zA-Z]+$")); } } } 正規表現を使った方法(2) 数字を表す正規表現として、[0-9]の代わりに\dを使っています。 単純に\dを使うと全角の数字もマッチしてしまうため、Regex.IsMatch()の第3引数としてRegexOptions.ECMAScriptを指定しています。 動作は「正規表現を使った方法(1)」と同じですが、コードが分かりにくくなるのでこの実装は避けた方が良さそうです... TextChecker.cs using System.Text.RegularExpressions; namespace CSharpStudy.Text { public class TextChecker { /// <summary> /// 引数の文字列が半角英数字のみで構成されているかを調べる。 /// </summary> /// <param name="text">チェック対象の文字列。</param> /// <returns>引数が英数字のみで構成されていればtrue、そうでなければfalseを返す。</returns> public static bool IsOnlyAlphanumeric3(string text) { // 文字列の先頭から末尾までが、英数字のみとマッチするかを調べる。 return (Regex.IsMatch(text, @"^[\da-zA-Z]+$", RegexOptions.ECMAScript)); } } } 参考URL 文字列のバイト数を取得するには? 文字がひらがなか、カタカナか、漢字か、英数字か調べる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gtk3アプリ GtkButton処理関連

ボタンのWidthHeightの取得 Gtk.Button btn = new Button(); int width; int height; btn.GetSizeRequest(out width,out height); ボタンのWidthHeightの設定 Gtk.Button btn = new Button(); btn.SetSizeRequest(100, 35); ボタンを動的に追加する GtkLayoutをGladeに追加します。IDをつけます。ここではlayOut1 追加した後にShowAll()を実行しないと表示されないです。 public MainWindow() : this(new Builder("MainWindow.glade")) { Gtk.Button btn = new Button(); btn.Label = "テスト"; layOut1.Put(btn,100,120); btn.Clicked += delegate(object? sender, EventArgs args) { Console.WriteLine("テスト"); }; this.ShowAll(); } ボタンを動的に連続して追加する for(int i=0;i<5;i++) { Gtk.Button btn = new Button(); btn.Label = "test" + i.ToString(); btn.Name = i.ToString(); btn.Clicked += delegate(object? sender, EventArgs args) { Console.WriteLine(((Gtk.Button)sender).Name); }; int width; int height; btn.GetSizeRequest(out width,out height); int kankaku = height + i * 30; this.layOut.Put(btn,200,kankaku); } this.ShowAll(); 独自の変数を追加しイベントの中で取得する class ButtonEx : Gtk.Button { public string TestStr { get; set; } } public MainWindow() : this(new Builder("MainWindow.glade")) { ButtonEx btn = new ButtonEx(); btn.Label = "テスト"; btn.TestStr = "testtest"; layOut1.Put(btn,100,120); btn.Clicked += delegate(object? sender, EventArgs args) { Console.WriteLine(((ButtonEx)sender).TestStr); }; this.ShowAll(); } WidthHeight取得の拡張クラス static public Dictionary<int,int> _getWidthHeight(this Gtk.Button btn) { int width; int height; btn.GetSizeRequest(out width,out height); return new Dictionary<int, int>() {{ width, height} }; } static public void _setWidthHeight(this Gtk.Button btn,int width,int height) { btn.SetSizeRequest(width, height); } static public int _getWidth(this Gtk.Button btn) { int width; int height; btn.GetSizeRequest(out width,out height); return width; } static public int _getHeight(this Gtk.Button btn) { int width; int height; btn.GetSizeRequest(out width,out height); return height; } 続く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#でサクッと1行で現在日時をファイル出力する方法 (主にデバッグ用)

C# 6.0以降 (Visual Studio 2017 なら C# 7.0 ~ 7.3 らしい) hoge1.cs File.AppendAllText(@"C:\hoge.txt", $"{DateTime.Now:F}\n"); 現在のコンテキストに '*' という名前が存在しません。といったエラーが出たら、カーソルを合わせて、Alt+Enter (Ctrl+.)で、usingを自動追加してもらったらよいです。 それすらも面倒な人はこちら。 hoge2.cs System.IO.File.AppendAllText(@"C:\hoge.txt", $"{System.DateTime.Now:F}\n"); 備考 2022年1月23日 12:34:56といった感じに追記出力されます(末尾改行付き)。別のフォーマットで出したい人は、参考のリンク先を見てください。 追記ではなく上書きしたいなら、AppendAllText() → WriteAllText() 改行不要なら、末尾の\nを削除 他の情報も付与したければ、{}の外に記載 {}を複数使えば別の場所に変数埋め込んだりできます。例:(int num; が既にあるものとして`$"{num}: {DateTime.Now:F}\n"* \ではなく\\でディレクトリを書きたいなら@を削除(@はエスケープシーケンスを利用しないための接頭) 参考 日付や時刻を文字列に変換するには?:.NET TIPS - @IT https://atmarkit.itmedia.co.jp/ait/articles/0408/27/news104.html C#で簡単にファイル入出力 - Qiita https://qiita.com/t_sato310/items/6c6ec79f4487a52b6b9e
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GameObjectがPrefabかどうか判定する

GameObjectがPrefabかどうか(SceneにInstantiateされていないGameObjectであるか)を判定します。 public static bool IsPrefab(this GameObject gameObject) { return !gameObject.scene.IsValid(); } GameObjectがPrefabの場合、GameObject.scene.IsValid()はfalseになります。 UnityEngine.SceneManagement.Sceneはstructなので、IsValidを使用して判定します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む