zoukankan      html  css  js  c++  java
  • C# 3.0 Cookbook:二、字符与字符串处理(1):判断字符类型

    问题: 

          一个char类型的变量,我们要得到其中包含的字符类型是字母、阿拉伯数字、标点符号、控制符号、分隔符、特殊符号、空格还是替代符(例如值大于64K的Unicode字符集)。同样,一个string类型的变量,我们要得到其中某一个字符或某几个字符的类型。

    解决方案:

            要得到字符的类型,可以使用System.Char命名空间中的内置静态方法,具体如下:

    Char.IsControl Char.IsDigit
    Char.IsLetter Char.IsNumber
    Char.IsPunctuation Char.IsSeparator
    Char.IsSurrogate Char.IsSymbol
    Char.IsWhitespace  

    讨论:

        下面的例子描述了用怎样的方法可以返回一个字符的类型。首先,要创建一个几种字符类型的枚举类型:

    public enum CharKind
    {
    Digit,
    Letter,
    Number,
    Punctuation,
    Unknown
    }

        接下来,创建一个包含判断字符类型并且返回值为CharKind枚举类型的的扩展方法:

    static class CharStrExtMethods
    {
    public static CharKind GetCharKind(this char theChar)
    {
    if (Char.IsLetter(theChar))
    {
    return CharKind.Letter;
    }
    else if (Char.IsNumber(theChar))
    {
    return CharKind.Number;
    }
    else if (Char.IsPunctuation(theChar))
    {
    return CharKind.Punctuation;
    }
    else
    {
    return CharKind.Unknown;
    }
    }
    }

        GetCharKind扩展方法展示了使用多种内置静态方法测试字符类型的手段。所有不同的字符类型被定义在一个枚举类型并且由GetCharKind方法返回。

        假如无论怎样,一个字符串中的每个字符都要需要被测试其类型,可使用char结构的静态重载方法。接下来的代码修改了GetCharKind扩展方法,操作字符串变量接受

    static class CharStrExtMethods
    {
    public static CharKind GetCharKindInString(this string theString,
    int charPosition)
    {
    if (Char.IsLetter(theString, charPosition))
    {
    return CharKind.Letter;
    }
    else if (Char.IsNumber(theString, charPosition))
    {
    return CharKind.Number;
    }
    else if (Char.IsPunctuation(theString, charPosition))
    {
    return CharKind.Punctuation;
    }
    else
    {
    return CharKind.Unknown;
    }
    }
    }

        接下来的代码段判断字符串中的第5个字符是否为数字。(charPosition参数从0开始计数)

    string data = "abcdefg";
    if (string.GetCharKindInString(4) == CharKind.Digit) {...} 

    表2-1描述了char结构中的每一个静态方法:

    表2-1:char结构方法

    char 方法 描述
    IsControl 是否属于在范围\U007F, \U0000至\U001F, 和\U0080至\U009F的控制字符代码。
    IsDigit 是否属于在Unicode字符集中任意0到9的十进制数。
    IsLetter 是否属于字母类别。
    IsNumber 是否属于十进制数或十六进制数,包含上标文字和下标文字。
    IsPunctuation 是否属于标点符号。
    IsSeparator 是否属于分隔字符、分隔线或段落分隔符。
    IsSurrogate 是否属于在范围\UD800至\UDFFF之间的代理项字符。
    IsSymbol 是否属于任意的自述、货币、或其他符号类别,或其他修饰符。
    IsWhitespace 是否属于以下空白类型字符:

    \U0009
    \U000A
    \U000B
    \U000C
    \U000D
    \U0085
    \U2028
    \U2029

        在.NET 2.0框架中,有少数额外的Is*类型的函数被添加进来以增强现有的方法,如果问题中的字符是一个字母(也就是IsLetter方法返回为true),可以用表2-2的方法再判断字母是否为大写还是小写。

    表2-2:Char 结构的Uppercase 和 lowercase 方法

    char 方法 描述
    IsLower 字符是否为小写字母。
    IsUpper 字符是否为大写字母。

        如果问题中的字符是代理项字符(也就是IsSurrogate方法返回为true),可以使用表2-3中的方法得到更多代理项字符的信息。

    表2-3:Char 结构的Surrogate方法

    char 方法 描述
    IsHighSurrogate 范围在\UD800 至 \UDBFF之间的字符。
    IsLowSurrogate 范围在\UDC00 至\UDFFF之间的字符。

      除以上的Surrogate方法以外,当一个代理字符项由两个字符组成时,IsSurrogatePair方法返回true,也就是说当一人字符为高位替代符,当另一个字符为低位替代符时。

      最后在这组方法中要补充说明的是IsLetterOrDigit方法,当问题中的字符为字母或数字时该方法返回true,当需要判断某个字符是否为字母或数字时,可以使用IsLetter 方法和IsDigit 方法。

    还可参见

        MSDN中的“Char 结构”相关文档。

    版权说明:作者:张颖希PocketZ's Blog
    出处:http://www.cnblogs.com/PocketZ
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    本文翻译内容取自网络,纯粹是练习英文水平,如有雷同,纯属意外!有不妥之处,欢迎拍砖!

    版权说明:作者:张颖希PocketZ's Blog
    出处:http://www.cnblogs.com/PocketZ
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    若本文为翻译内容,目的为练习英文水平,如有雷同,纯属意外!有不妥之处,欢迎拍砖

  • 相关阅读:
    安卓输入法
    android问题
    速查
    Iphone幻灯片效果+背景音乐
    MBProgressHUD使用
    画图
    textmate 的快捷键
    设置Table Cell的背景图的类
    Objectc 一些代码规范
    效果收集
  • 原文地址:https://www.cnblogs.com/PocketZ/p/Determining_the_Kind_of_Character_a_Char.html
Copyright © 2011-2022 走看看