解析C#中不一样的大小写转换

假设有一个string “BaSiC”,需要将它转变为大小写,那么该如何转换?

最简单的方式:调用api:

string str = "BaSiC";

string strUpper = str.ToUpper();

string strLower = str.ToLower();

第二种方法:调用Char.ToUpper(),Char.ToLower()方法,同样是调用api


第三种方法:使用for循环来判断,如果是大写就,如果是小写就..

首先观察大写字母和小写字母的异同:

打印上面的代码如下,有兴趣的可以自己试试打印这样的表格出来:

Console.WriteLine("{0,-3} | {1,-6} | {2,-8} | {3,-3} | {4,-6} | {5,-8}",

"小写", "ascil", "2进制", "大写", "ascil", "2进制");

IEnumerable<char> chars = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (char)i);

foreach (char c in chars)

{

char upperC = char.ToUpper(c);

Console.WriteLine("{0,-5} | {1,-6} | {2,-10} | {3,-5} | {4,-6} | {5,-10}",

c, (int)c, Convert.ToString(c, 2),

upperC, (int)upperC, Convert.ToString(upperC, 2));

}

从上面很容易看的出来'a' 比大写的'A' 的ascil多32,从这点出发就可以得到下面的代码:

private static char[] GetUpperChars(string str)

{

char[] chars = str.ToCharArray();

for (int i = 0; i < chars.Length; i++)

{

if (char.IsLower(chars[i]))

{

chars[i] = (char)(chars[i] - 32);

}

}

return chars;

}

这段代码使用for循环并加入判断,如果是小写,则将其值减去32,调用也比较简单:

string strUpper2 = new string(GetUpperChars(str));

这段代码唯一的缺点是进行了IsLower的判断,可不可以在没有判断的情况下来修改chars使其变成大写呢?

如果从Ascii 的角度来解决这个问题,那么我们就必须使用大小写的判断,我在汇编语言的书上看到了这句话:

如果一个问题的解决方案,使我们陷入一种矛盾之中,那么很可能是我们考虑问题的出发点有了问题,或者说我们起初运用的规律并不适合。

这段话的意思是,可能我们应该从其他角度来观察,而不应该从Ascii的角度来观察。

如果不从Ascii的角度来观察,那还能从哪里来观察呢?

可以从2进制的角度来观察。

还是这幅图,只是我们的观察角度变成了2进制。

a 的2进制:1100001, b的2进制1100010,..

A 的2进制: 1000001, B的2进制1000010,..

可以知道a的第5位是1,而A的第5位是0,(从右边往左边数,0开始,后面得第几位都这样数)

b的第5位是1,而B的第5位是0,

..

所以如果要将一个字符串变成大写,只需要将字符串的所有字符的第5位全部变成1就可以了。

而如何将一个字符的第5位变成1呢?

答案是使用And(位运算)操作.

首先a 是个7位字符,只所以是7位,是因为在制定Ascii的时候位比较贵,8位比较浪费,而6位又不够,所以ascii码是7位的,这点从

a 是1100001 就可以看出了,总共7位。

它可以和0101-1111 或者是1101-1111,进行And

在C#中And 是&

所以你可能会将函数修改为:

for (int i = 0; i < chars.Length; i++)

{

chars[i] = (char)(chars[i] & 11011111);

}

先停一下,你认为上面的写法正确吗?

然后运行,结果却发现:

为什么?

这是因为C#中的& 默认操作的是十进制的数字,所以11011111,

就会变成一千一百零一万一千一百一十一

所以要将2进制的11011111 变成10进制,如何转变?

int value = Convert.ToInt32("11011111", 2);

value的值是223.所以代码修改为:

for (int i = 0; i < chars.Length; i++)

{

chars[i] = (char)(chars[i] & 223);

}

运行可以得到正确的结果:

或者使用16进制来表示:1101-1111 ,的16进制是:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0 1 2 3 4 5 6 7 8 9  A  B  C   D  E  F

1101=2^3+2^2+1=8+4+1=13 = D

1111=2^3+2^2+2^1+2^0=8+4+2+1=15 = F

所以可以将上面的代码修改为:

chars[i] = (char)(chars[i] & 0xdf);

同样因为只是第5位不同,而第7位会被忽略。所以和 0101-1111进行and操作也可以得到正确的答案:

而0101-1111 的16进制是0x5f.所以代码可以变成:

chars[i] = (char)(chars[i] & 0x5f);

(0)

相关推荐

  • C#中把英文字母转换为大写或小写的方法

    将字母全部转换为大写或小写,在C#编程中是一个非常常见的功能.在开发过程中,经常需要验证用户登录,用户在输入用户名时可能不区分大小写,如果我们不对字母进行大写或小写的转换,那用户即使输入了正确的密码,可能也无法成功登录.另外,我们有的时候会用字符串来作为操作代码,比如 action="Create",如果我在后面比较的时候写成了"create"或"CREATE",那都是有问题的. 所以,一种最好的解决办法就是,将字符串统一转换大写或小写. 字母转

  • C# char类型字符转换大小写的实现代码

    C# char类型有自带的大小写转换方法:ToUpper和ToLowerchar str1 = 'a';char str2 = 'A';Char.ToUpper(str1); Char.ToLower(str2);

  • C#将指定目录所有文件名转换成小写的方法

    本文实例讲述了C#将指定目录所有文件名转换成小写的方法.分享给大家供大家参考.具体如下: using System; using System.IO; using System.Linq; namespace RobvanderWoude { class LoCase { static int Main( string[] args ) { string dir = string.Empty; string filespec = string.Empty; char[] trailingback

  • C#实现对字符串进行大小写切换的方法

    本文实例讲述了C#实现对字符串进行大小写切换的方法.分享给大家供大家参考.具体实现方法如下: C#代码如下: 复制代码 代码如下: public class Program {     public static void Main()     {         string s = "OsChInAhI§$%&/()1234567890";         Func<char, char> toggle = c => char.IsUpper(c) ? c

  • C# 大小写转换(金额)实例代码

    Class:EcanRMB.cs 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Jxc.WinClient.BLL {     public class EcanRMB     {         /// <summary>         /// 转换人民币大小金额         /// </summary>  

  • C#将制定目录文件名转换成大写的方法

    本文实例讲述了C#将制定目录文件名转换成大写的方法.分享给大家供大家参考.具体如下: using System; using System.IO; using System.Linq; namespace RobvanderWoude { class UpCase { static int Main( string[] args ) { string dir = string.Empty; string filespec = string.Empty; char[] trailingbacksl

  • 解析C#中不一样的大小写转换

    假设有一个string "BaSiC",需要将它转变为大小写,那么该如何转换? 最简单的方式:调用api: string str = "BaSiC"; string strUpper = str.ToUpper(); string strLower = str.ToLower(); 第二种方法:调用Char.ToUpper(),Char.ToLower()方法,同样是调用api 第三种方法:使用for循环来判断,如果是大写就,如果是小写就.. 首先观察大写字母和小写

  • C语言中对字母进行大小写转换的简单方法

    C语言tolower()函数:将大写字母转换为小写字母 头文件: #include <ctype.h> 定义函数: int toupper(int c); 函数说明:若参数 c 为小写字母则将该对应的大写字母返回. 返回值:返回转换后的大写字母,若不须转换则将参数c 值返回. 范例:将s 字符串内的小写字母转换成大写字母. #include <ctype.h> main(){ char s[] = "aBcDeFgH12345;!#$"; int i; prin

  • javascript字母大小写转换的4个函数详解

    js中实现字母大小写转换主要用到了四个js函数: 1.toLocaleUpperCase2.toUpperCase3.toLocaleLowerCase4.toLowerCase 下面就这四个实现大小写转换的js函数逐一做简单的分析. 1.toLocaleUpperCase 将字符串中所有的字母字符都将被转换为大写的,同时适应宿主环境的当前区域设置. 2.toUpperCase 将字符串中的所有字母都被转化为大写字母. 3.toLocaleLowerCase 将字符串所有的字母字符都被转换为小写

  • Python判断字符串与大小写转换

    判断字符串 s.isalnum() #所有字符都是数字或者字母 s.isalpha() #所有字符都是字母 s.isdigit() #所有字符都是数字 s.islower() #所有字符都是小写 s.isupper() #所有字符都是大写 s.istitle() #所有单词都是首字母大写,像标题 s.isspace() #所有字符都是空白字符.\t.\n 大小写转换 s.upper() #把所有字符中的小写字母转换成大写字母 s.lower() #把所有字符中的大写字母转换成小写字母 s.cap

  • 解析MySQL中存储时间日期类型的选择问题

    一般应用中,我们用timestamp,datetime,int类型来存储时间格式: int(对应javaBean中的Integer或int) 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mysql提供的时间函数 结论:适合需要进行大量时间范围查询的数据表 datetime(javaBean中用Date类型) 1. 占用8个字节 2. 允许为空值,可以自定义值,系统不会自动修改其值. 3. 实际格式储存(Just stores w

  • Country使 MS-DOS 子系统能使用国际时间、日期、货币、大小写转换和小数分隔符

    Country 使 MS-DOS 子系统能使用国际时间.日期.货币.大小写转换和小数分隔符. 语法 country=xxx[,[yyy][,[Drive:][Path] FileName]] 参数 xxx  指定国家(地区)代码.  yyy  指定国家(地区)的代码页.  [Drive:}[Path] FileName  指定包含国家(地区)信息文件的位置和名称.  /?  在命令提示符显示帮助.  注释 country 命令配置 MS-DOS 子系统识别其中一种支持语言所使用的字符集和遵守的标

  • 深入解析JavaScript中的数字对象与字符串对象

    JavaScript Number 对象 JavaScript 只有一种数字类型. 可以使用也可以不使用小数点来书写数字. JavaScript 数字 JavaScript 数字可以使用也可以不使用小数点来书写: 实例 var pi=3.14; // 使用小数点 var x=34; // 不使用小数点 极大或极小的数字可通过科学(指数)计数法来写: 实例 var y=123e5; // 12300000 var z=123e-5; // 0.00123 所有 JavaScript 数字均为 64

  • php大小写转换函数(strtolower、strtoupper)用法介绍

    1,将字符串转换成小写 strtolower函数: 该函数将传入的字符串参数所有的字符都转换成小写,并以小定形式放回这个字符串. 例子: <?php $str = "I want To FLY"; $str = strtolower($str); echo $str; //by www.jb51.net ?> 输出: i want to fly 2,将字符转成大写 strtoupper函数:该函数的作用同strtolower函数相反,是将传入的字符参数的字符全部转换成大写,

  • Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    去空格及特殊符号 s.strip().lstrip().rstrip(',') Python strip() 方法用于移除字符串头尾指定的字符(默认为空格). 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sStr1 = 'strcpy2' print sStr2 连接字符串 #strcat(sStr1,sStr2) sStr1 = 'strcat' sStr2 = 'append' sStr1 += sStr2 print

  • Python字符串大小写转换拼接删除空白

    1.字符串大小写转换 string.title() #将字符串中所有单词的首字母以大写形式显示 string.upper() #将字符串中所有字母转化为大写字母 string.lower() #将字符串中所有字母转化为小写字母 str = "hello world!" print(str.title()) Hello World! print(str.upper()) HELLO WORLD! print(str.lower()) hello world! 2.字符拼接 python中

随机推荐