読者です 読者をやめる 読者になる 読者になる

プログラミング C# - 翔ソフトウェア (Sho's)

C#/.NET/ソフトウェア開発など

文字が数字かどうかを判定する (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 と同じ結果となった。