诺言

导航

4、字符、数字之间转换

一、(int)、int.Parse、int.tryParse、Convert.ToInt32的区别?

Convert.ToInt32 与 int.Parse 较为类似,实际上 Convert.ToInt32 内部调用了 int.Parse:

Convert.ToInt32 参数为 null 时,返回 0; int.Parse 参数为 null 时,抛出异常。

Convert.ToInt32 参数为 "" 时,抛出异常; int.Parse 参数为 "" 时,抛出异常。

Convert.ToInt32 可以转换的类型较多; int.Parse 只能转换数字类型的字符串。

int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为 0。

(int) 属 cast 转换,只能将其它数字类型转换成 int 类型,它不能转换字符串,比如下例就会失败:

string v = "1";  int n = (int)v;

二、ToString()、Convert.ToString()、(string)、as string 的区别

通常object到 string有四种方式(假设有object obj):obj.ToString()、Convert.ToString()、(string)obj、obj as string。他们都能将 object 对象转换成 string 对象。我就讲讲他们的异同以及在实际中应该使用哪个。

前两个方法通常是由别的对象得到 string 对象,它们间的区别只表现在要转换的对象为 null 时,如果 obj 为 null,调用 obj.ToString 方法会导致 NullReferenceException 异常,调用 Convert.ToString 不会抛出异常而返回一个 null。

用强制转换 (string)obj 要求 obj 的运行时类型必须是 string。如果不是,就会抛出异常。用 as 方法则会相对平稳,当 obj 的运行时类型不是 string 时会返回 null 而不抛出异常。

所以在通常在我们需要得到某个对象的 string 表达形式时,我们应该使用 ToString 和 Convert.ToString,这时候你就得根据情形选一个,假如你能保证你的对象不为 null,则两个差不多。如果有可能为 null,你就应该用 Convert.ToString,如果你希望它为 null 的时候抛出异常,那么当然可以选择 ToString。

三、C# 中String和 Stringbuilder的区别

String 对象是不可改变的。每次使用 String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。而 StringBuilder 则不会,在需要对字符串执行重复修改的情况下,创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类;例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

1、设置容量与长度

StringBuilder   MyStringBuilder   =   new   StringBuilder("Hello   World!",   25);   方式1
MyStringBuilder.Capacity   =   25;  方式2
EnsureCapacity   方法可用来检查当前   StringBuilder   的容量。如果容量大于传递的值,则不进行任何更改;但是,如果容量小于传递的值,则会更改当前的容量以使其与传递的值匹配。  
也可以查看或设置   Length   属性。如果将   Length   属性设置为大于   Capacity   属性的值,则自动将   Capacity   属性更改为与   Length   属性相同的值。如果将   Length   属性设置为小于当前   StringBuilder   对象内的字符串长度的值,则会缩短该字符串。

2、 修改 StringBuilder  字符串

方法名                                    使用 
StringBuilder.Append                将信息追加到当前 StringBuilder 的结尾
StringBuilder.AppendFormat         用带格式文本替换字符串中传递的格式说明符
StringBuilder.Insert                      将字符串或对象插入到当前 StringBuilder 对象的指定索引处
StringBuilder.Remove                从当前 StringBuilder 对象中移除指定数量的字符
StringBuilder.Replace                    替换指定索引处的指定字符
Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。下面的示例将一个 StringBuilder 对象初始化为“Hello World”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Append(" What a beautiful day.");

Console.WriteLine(MyStringBuilder);
//此示例将 Hello World! What a beautiful day. 显示到控制台。
AppendFormat 方法将文本添加到 StringBuilder 的末尾,而且实现了 IFormattable 接口,因此可接受格式化部分中描述的标准格式字符串。可以使用此方法来自定义变量的格式并将这些值追加到 StringBuilder 的后面。下面的示例使用 AppendFormat 方法,将一个设置为货币值格式的整数值放到 StringBuilder 的末尾。

int MyInt = 25;

StringBuilder MyStringBuilder = new StringBuilder("Your total is ");

MyStringBuilder.AppendFormat("{0:C} ", MyInt);

Console.WriteLine(MyStringBuilder);

//此示例将 Your total is $25.00 显示到控制台。
Insert 方法将字符串或对象添加到当前 StringBuilder 中的指定位置。下面的示例使用此方法将一个单词插入到 StringBuilder 的第六个位置。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Insert(6, "Beautiful ");

Console.WriteLine(MyStringBuilder); 
//此示例将 Hello Beautiful World! 显示到控制台。
Remove 方法从当前 StringBuilder 中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。下面的示例使用 Remove 方法缩短 StringBuilder。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Remove(5, 7);

Console.WriteLine(MyStringBuilder);

//此示例将 Hello 显示到控制台。

使用 Replace 方法,可以用另一个指定的字符来替换 StringBuilder 对象内的字符。下面的示例使用 Replace 方法来搜索 StringBuilder 对象,查找所有的感叹号字符 (!),并用问号字符 (?) 来替换它们。

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

MyStringBuilder.Replace('!', '?');

Console.WriteLine(MyStringBuilder);

//此示例将 Hello World? 显示到控制台。

3、将Stringbuilder串转换为string形式

string = StringBuilder.toString();

 

 

四、             字符串格式化汇总:

C

货币

2.5.ToString("C")

¥2.50

D

十进制数

25.ToString("D5")

00025

E

科学型

25000.ToString("E")

2.500000E+005

F

固定点

25.ToString("F2")

25.00

G

常规

2.5.ToString("G")

2.5

N

数字

2500000.ToString("N")

2,500,000.00

X

十六进制

255.ToString("X")

FF

formatCode 是可选的格式化代码字符串。
必须用“{”和“}”将格式与其他字符分开。如果恰好在格式中也要使用大括号,可以用连续的两个大括号表示一个大括号,即: “{{”或者“}}”。

常用格式举例:
(1) int i=12345;
this.textBox1.Text=i.ToString();
//结果 12345(this指当前对象,或叫当前类的实例)
this.textBox2.Text=i.ToString("d8");  //结果 00012345
(2) int i=123;
double j=123.45;
string s1=string.Format("the value is {0,7:d}",i);
string s2=string.Format("the value is {0,7:f3}",j);
this.textBox1.Text=s1 ;   //结果 the value is 123
this.textBox2.Text=s2;   //结果 the value is 123.450
(3)double i=12345.6789;
this.textBox1.Text=i.ToString("f2"); //结果 12345.68
this.textBox2.Text=i.ToString("f6");//结果 12345.678900
(4)double i=12345.6789;
this.textBox1.Text=i.ToString("n"); //结果 12,345.68
this.textBox2.Text=i.ToString(“n4”); //结果 12,345.6789
(5)double i=0.126;
string s=string.Format("the value is {0:p}",i);
this.textBox1.Text=i.ToString("p"); //结果 12.6%
this.textBox2.Text=s; //结果 the value is 12.6%
(6) DateTime dt =new DateTime(2003,5,25);
this.textBox1.Text=dt.ToString("yy.M.d"); //结果 03.5.25
this.textBox2.Text=dt.ToString(“yyyy年M月”);//结果 2003年5月
Convert.ToDateTime("2005/12/22 22:22:22").ToString("yyyy/MM/dd HH:mm:ss")
"2005/12/22 22:22:22"
(7) int i=123;double j=123.45;
string s=string.Format("i:{0,-7},j:{1,7}",i,j); //-7表示左对齐,占7位
this.textBox1.Text=s ;    //结果i:123 ,j: 123.45

(8) string s7 = String.Format("{0:(###) ###-####}", 8005551212)

//生成(800) 555-1212

int a = 12345678;double b = 1234.12543;

 string s8= String.Format("abcd{0:C}abcd", b);//abcd¥1,234.13abcd

string s9 = "abcd" + b.ToString("C") + "abcd";//abcd¥1,234.13abcd

string s10 = String.Format("{0:C3}", b);//¥1,234.125

string s11 = b.ToString("C3");//¥1,234.125

string s12 = String.Format("{0:d}", a);//十进制--12345678

string s14 = String.Format("{0:e}", a);//指数--1.234568e+007

string s16 = String.Format("{0:f}", a);//定点数--12345678.00

string s18 = String.Format("{0:n}", a);//数值--12,345,678.00

string s20 = String.Format("{0:x}", a);//十六进制--bc614e

string s22 = String.Format("{0:g}", a);//通用为最紧凑—12345678

b = 4321.12543;a = 1234;

string s24 = String.Format("{0:000000}", a);// 001234

string s25 = String.Format("{0:000000}", b);// 004321

//# 描述:占位符,如果可能,填充位

string s26 = String.Format("{0:#######}", a);// 1234

string s27 = String.Format("{0:#######}", b);// 4321

string s28 = String.Format("{0:#0####}", a);// 01234

string s29 = String.Format("{0:0#0000}", b);// 004321

//. 描述:小数点

string s30 = String.Format("{0:000.000}", a);//1234.000

string s31 = String.Format("{0:000.000}", b);//4321.125

b = 87654321.12543;a = 12345678;

//, 描述:数字分组,也用于增倍器

string s32 = String.Format("{0:0,00}", a);// 12,345,678

string s33 = String.Format("{0:0,00}", b);// 87,654,321

string s34 = String.Format("{0:0,}", a);// 12346

string s35 = String.Format("{0:0,}", b);// 87654

string s36 = String.Format("{0:0,,}", a);// 12

string s37 = String.Format("{0:0,,}", b);// 88

string s38 = String.Format("{0:0,,,}", a);// 0

string s39 = String.Format("{0:0,,,}", b);// 0

//   % 描述:格式为百分数

string s40 = String.Format("{0:0%}", a);// 1234567800%

string s41 = String.Format("{0:#%}", b);// 8765432113%

string s42 = String.Format("{0:0.00%}", a);// 1234567800.00%

string s43 = String.Format("{0:#.00%}", b);// 8765432112.54%

四、如何进行字节数组和字符串的相互转换?

     将字符串转换为字节数组时,需要调用System.Text.Encoding命名空间中各种编码类的GetBytes方法,而将字节数组转换为字符串时,则需要调用System.Text.Encoding命名空间中的各种编码的GetString方法。例如:

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            string s = "nbjjjlljjoijio";

            byte[] bytes = Encoding.Default.GetBytes(s);

            string ss = string.Empty;

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

            {

                ss += bytes[i].ToString();

            }

            Console.WriteLine(ss);

            ss = Encoding.Default.GetString(bytes);

            Console.WriteLine(ss);

        }

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

五、把一个整数分解成2的次幂

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()  {InitializeComponent();}

        private List<int> tempList = new List<int>();

        private void button1_Click(object sender, EventArgs e)

        {

            tempList.Clear();  listBox1.Items.Clear();

            int intValue = Convert.ToInt32(textBox1.Text.Trim());

            GetList(intValue);

            foreach (int i in tempList)           

                listBox1.Items.Add(i);           

        }

        private void GetList(int value)

        {

            if (value == 0)

                return;

            for (int i = value; i > 0; i--)

            {

                if ((i & (i - 1)) == 0)//如果是2的次

                {//幂则与本身的下位相与为0

                    tempList.Add(i);

                    GetList(value - i);

                    break;

                }

            }

        }

    }

}

 

将字符串 1234||1123||2344||123||567按||分成数组:

  String ss=” 1234||1123||2344||123||567”;

  string[] mobileArray=ss.Replace(“||”,”,”).Split(‘,’);

 

 

 

 

 

 

 

 

五、字母和ASCII的转换。

namespace WindowsFormsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void btnToASC_Click(object sender, EventArgs e)

        {

            if (txtChar.Text != string.Empty)

            {

                if (Encoding.GetEncoding("unicode").GetBytes(new char[] {txtChar.Text[0]})[1] == 0)

                {

                    txtToASC.Text = Encoding.GetEncoding("unicode").GetBytes(txtChar.Text)[0].ToString();

//得到ASCII值

                }

                else

                {

                    txtToASC.Text = ""; MessageBox.Show("请输入字母","提示");

                }

            }

        }

        private void btnToChar_Click(object sender, EventArgs e)

        {

            if (txtASC.Text != string.Empty)

            {

                int intNum;

                if (int.TryParse(txtASC.Text, out intNum))

                {//将ASCII转换为字符。

                    txtToChar.Text =((char)intNum).ToString();               

}

            }

 }                     

    }

}

 

 

 

 

 

六、汉字和区位码之间的转换。

   过程:通过Encoding对象的GetBytes方法得到汉字的字节数组,将字节数的第一位和第二位分别转为整形数值,然后将得到的两个整形数值分别减160后转换为字符串,连接两个字符串就组成了汉字区位码。

namespace ChineseCode

{

    public partial class Frm_Main : Form

    {

        public Frm_Main()

        {

            InitializeComponent();

        }

        private void btn_Get_Click(object sender, EventArgs e)

        {

            if (txt_Chinese.Text != string.Empty)//判断输入是否为空

            {

                try

                {

                    txt_Num.Text = getCode(txt_Chinese.Text);

                }

                catch (IndexOutOfRangeException ex)

                {

                    MessageBox.Show(ex.Message + "请输入正确的汉字", "出错!");

                }

            }

        }

        /// <summary>

        /// 得到汉字区位码方法

        /// </summary>

        /// <param name="strChinese">汉字字符</param>

        /// <returns>返回汉字区位码</returns>

        public string getCode(string Chinese)

        {

            byte[] P_bt_array = Encoding.Default.GetBytes(Chinese);//得到汉字的Byte数组

            int front = (short)(P_bt_array[0] - '\0');//将字节数组的第一位转换成short类型

            int back = (short)(P_bt_array[1] - '\0');//将字节数组的第二位转换成short类型

            return (front - 160).ToString() + (back - 160).ToString();//计算并返回区位码

        }

    }

}

posted on 2015-12-29 15:36  SRTC  阅读(602)  评论(0编辑  收藏  举报