[C#] 文字が数字かどうかを判定する (char.IsNumber メソッドでローマ数字や漢数字は数字と看做される?)

文字が数字かどうかを判定する場合、System.Char.IsNumber メソッドを使うことができる。

では、ローマ数字などは数字と判定されるのだろうか?

char.IsNumber の場合

今回調べた結果、次のようなテストが通ることが分かった。

using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class CommonTest
{
[TestMethod]
public void charのIsNumberのテスト()
{
// ※ 一部に機種依存文字があるので注意
// 指定した文字が数字だと判断されるケース
Assert.IsTrue(char.IsNumber('0'));
Assert.IsTrue(char.IsNumber('1'));
Assert.IsTrue(char.IsNumber('Ⅲ')); // ローマ数字 (大文字) の 3
Assert.IsTrue(char.IsNumber('ⅲ')); // ローマ数字 (小文字) の 3
Assert.IsTrue(char.IsNumber('Ⅰ')); // ローマ数字 (大文字) の 1
Assert.IsTrue(char.IsNumber('①')); // 丸付きの 1
Assert.IsTrue(char.IsNumber('2')); // 所謂全角の 2
// 指定した文字が数字だと判断されないケース
Assert.IsFalse(char.IsNumber('.')); // 小数点
Assert.IsFalse(char.IsNumber('-')); // マイナス記号
Assert.IsFalse(char.IsNumber('I')); // アルファベットの I
Assert.IsFalse(char.IsNumber('一')); // 漢数字
Assert.IsFalse(char.IsNumber('四')); // 漢数字
Assert.IsFalse(char.IsNumber('壱')); // 大字の 1
Assert.IsFalse(char.IsNumber('壹')); // 大字の 1 (壱の舊字體)
}
} 

ローマ数字や丸付き数字、所謂全角の数字が数字と見做されていることが分かる。

char.IsDigit の場合

char.IsDigit だとどうだろう。

using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestMethod]
public void charのIsDigitのテスト()
{
// ※ 一部に機種依存文字があるので注意
// 指定した文字が数字だと判断されるケース
Assert.IsTrue(char.IsDigit('0'));
Assert.IsTrue(char.IsDigit('1'));
Assert.IsTrue(char.IsDigit('2')); // 所謂全角の 2
// 指定した文字が数字だと判断されないケース
Assert.IsFalse(char.IsDigit('.')); // 小数点
Assert.IsFalse(char.IsDigit('-')); // マイナス
Assert.IsFalse(char.IsDigit('①')); // 丸付きの 1
Assert.IsFalse(char.IsDigit('Ⅲ')); // ローマ数字 (大文字) の 3
Assert.IsFalse(char.IsDigit('ⅲ')); // ローマ数字 (小文字) の 3
Assert.IsFalse(char.IsDigit('Ⅰ')); // ローマ数字 (大文字) の 1
Assert.IsFalse(char.IsDigit('I')); // アルファベットの I
Assert.IsFalse(char.IsDigit('一')); // 漢数字
Assert.IsFalse(char.IsDigit('四')); // 漢数字
Assert.IsFalse(char.IsDigit('壱')); // 大字の 1
Assert.IsFalse(char.IsDigit('壹')); // 大字の 1 (壱の舊字體)
}

こちらでは、ローマ数字や丸付き数字が数字だと見做されない。

int.TryParse の場合

int.TryParse でもやってみた。

using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestMethod]
public void intのTryParseのテスト()
{
// ※ 一部に機種依存文字があるので注意
int number;
// 指定した文字が数字だと判断されるケース
Assert.IsTrue(int.TryParse("0", out number));
Assert.IsTrue(int.TryParse("1", out number));
Assert.IsTrue(int.TryParse("2", out number)); // 所謂全角の 2
// 指定した文字が数字だと判断されないケース
Assert.IsFalse(int.TryParse(".", out number)); // 小数点
Assert.IsFalse(int.TryParse("-", out number)); // マイナス
Assert.IsFalse(int.TryParse("①", out number)); // 丸付きの 1
Assert.IsFalse(int.TryParse("Ⅲ", out number)); // ローマ数字 (大文字) の 3
Assert.IsFalse(int.TryParse("ⅲ", out number)); // ローマ数字 (小文字) の 3
Assert.IsFalse(int.TryParse("Ⅰ", out number)); // ローマ数字 (大文字) の 1
Assert.IsFalse(int.TryParse("I", out number)); // アルファベットの I
Assert.IsFalse(int.TryParse("一", out number)); // 漢数字
Assert.IsFalse(int.TryParse("四", out number)); // 漢数字
Assert.IsFalse(int.TryParse("壱", out number)); // 大字の 1
Assert.IsFalse(int.TryParse("壹", out number)); // 大字の 1 (壱の舊字體)
}

こちらは、char.IsDigit と同じ結果となった。

.NETC#

Posted by Fujiwo