"012345678"かどうかを判定せよ §
その文字が数字の1文字であり、9ではないことを判定するメソッドが必要となりました。既存の判定メソッドは使えません。
どう書けば良いでしょうか?
正攻法で書いたのがサンプルソースのtestChar1メソッドです。
長いですね。
特定の文字群の中に指定の文字が含まれるかは文字列のContainsメソッドで判定できます。
これがサンプルソースのtestChar2メソッドです。
ずっと短いですね。
しかし、アラビア数字の文字には以下の特徴があります。
- 0から9まで順番に並んでいる
- 他の文字は割り込まない
ですから、不等号で文字の番号を比較して安全です。ch >= '0' && ch <= '8'という比較式は間違いなく0,1,2,3,4,5,6,7,8だけを区別します。
これがサンプルソースのtestChar3メソッドです。
罠の数々 §
- アラビア数字の0から9までは順番に並んでいる。しかし、漢数字の一から九までが順番に並んでいるわけではない
- 大文字のAからZ、小文字のaからzも順番だが、ウムラウトなどが含まれると順番に並んでいるとは見なせない。また大文字と小文字も並んでいない
- 文字の並び順を決めているのはUnicodeある。C#でも.NETでもない。
参考リンク §
String.Contains メソッド
一般的には判定する文字の並び順が規則正しいことは希で、実はcharTest2のパターンが使われることも多い。そのような意味でString.Contains メソッドは便利である。String.Contains メソッドには文字を判定する以外の使い方もあるので、上記リンクを辿って様々なバリエーションを確認しておこう。
リポジトリ §
https://github.com/autumn009/cshowto
NumberCharCode §
using System;
class Program
{
private static bool charTest1(char ch)
{
return ch == '0'
|| ch == '1'
|| ch == '2'
|| ch == '3'
|| ch == '4'
|| ch == '5'
|| ch == '6'
|| ch == '7'
|| ch == '8';
}
private static bool charTest2(char ch)
{
return "012345678".Contains(ch);
}
private static bool charTest3(char ch)
{
return ch >= '0' && ch <= '8';
}
static void Main()
{
Console.WriteLine($"charTest1('A')={charTest1('A')}");
Console.WriteLine($"charTest1('3')={charTest1('3')}");
Console.WriteLine($"charTest2('A')={charTest2('A')}");
Console.WriteLine($"charTest2('3')={charTest2('3')}");
Console.WriteLine($"charTest3('A')={charTest3('A')}");
Console.WriteLine($"charTest3('3')={charTest3('3')}");
}
}
実行結果
charTest1('A')=False
charTest1('3')=True
charTest2('A')=False
charTest2('3')=True
charTest3('A')=False
charTest3('3')=True