Char.IsSymbol(“*”)是假的

时间:2013-02-05 13:08:19

标签: vb.net

我正在进行密码验证例程,并且很惊讶地发现VB不会将'*'视为Char.IsSymbol()检查的符号。 以下是QuickWatch的输出:

char.IsSymbol("*")  False   Boolean

MS documentation未指定IsSymbol匹配的字符,但暗示包含标准数学符号here

有没有人对匹配所有标准美国特殊字符有什么好主意?

3 个答案:

答案 0 :(得分:9)

此上下文中符号的字符:UnicodeCategory.MathSymbol命名空间中的UnicodeCategory.CurrencySymbolUnicodeCategory.ModifierSymbolUnicodeCategory.OtherSymbolSystem.Globalization。这些是分别指定为Sm,Sc,Sk和So的Unicode字符。所有其他字符都会返回False

来自.Net来源:

internal static bool CheckSymbol(UnicodeCategory uc)
{
    switch (uc)
    {
        case UnicodeCategory.MathSymbol:
        case UnicodeCategory.CurrencySymbol:
        case UnicodeCategory.ModifierSymbol:
        case UnicodeCategory.OtherSymbol:
            return true;
        default:
            return false;
    }
}

或转换为VB.Net:

Friend Shared Function CheckSymbol(uc As UnicodeCategory) As Boolean
    Select Case uc
        Case UnicodeCategory.MathSymbol, UnicodeCategory.CurrencySymbol, UnicodeCategory.ModifierSymbol, UnicodeCategory.OtherSymbol
            Return True
        Case Else
            Return False
    End Select
End Function

CheckSymbolIsSymbol使用给定char的Unicode类别调用。

由于*属于OtherPunctuation类别(您可以使用char.GetUnicodeCategory()进行检查),因此不会将其视为符号,方法正确返回False

要回答您的问题:使用char.GetUnicodeCategory()检查角色属于哪个类别,并决定是否将其包含在您自己的逻辑中。

答案 1 :(得分:4)

如果您只是需要知道该字符不是数字或字母, 只使用

!char.IsLetterOrDigit(c) 

最好是

&& !char.IsControl(c)

答案 2 :(得分:0)

也许你有编译器选项“严格”,因为

Char.IsSymbol("*")

我收到编译错误

BC30512: Option Strict On disallows implicit conversions from 'String' to 'Char'.

要在VB.NET中定义字符文字,必须在字符串中添加c,如下所示:

Char.IsSymbol("*"c)