`
lovnet
  • 浏览: 6722287 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

如何把string解析为int?[C#]

阅读更多

如何把string解析为int?[C#]

How to Parse a string to an int? [C#]

Writen by Allen Lee

Q:如何把string解析为int?

A:简单的方法有三种:

stringsource="1412";
intresult=0;

//使用Convert.ToInt32(stringvalue);
result=Convert.ToInt32(source);

//使用Int32.Parse(stringvalue);
result=Int32.Parse(source);

//使用Int32.TryParse(strings,outintresult);
Int32.TryParse(source,outresult);

Q:这三种方法有什么不同?

A:一个简单的回答是:

如果解析失败,Int32.Parse(source)总会抛出异常;Convert.ToInt32(source)在source为null的情况下不会抛出异常而是简单的返回0给调用方;而Int32.TryParse(source, result)则无论如何都不抛出异常,只会返回true或false来说明解析是否成功,如果解析失败,调用方将会得到0值。

Q:如果我要解析的字符串的字面数值不是十进制的话,那么从这些方法中得到的返回值是有问题的。有什么方法解决?

A:那么你就需要这些方法的对应重载版本了,一个简单的方法是使用Convert类的

publicstaticintToInt32(stringvalue,intfromBase);

其中fromBase的值只能为2、8、10或者16,用于指定进制方式。如果fromBase不是指定的数值或者value不为十进制而又带有前缀正负号,就会抛出ArgumentException。

stringsource="0x1412";//这里的0x(或0X)前缀是可选的。
intresult=Convert.ToInt32(source,16);

当然,你还可以通过为Int32类的

publicstaticintParse(strings,NumberStylesstyle);

指定NumberStyles.AllowHexSpecifier或者NumberStyles.HexNumber为第二个参数来解析十六进制字面值的字符串,此时,你需要引用System.Globalization命名空间。

或者使用Int32类的

publicstaticboolTryParse(strings,NumberStylesstyle,IFormatProviderprovider,outintresult);

并指定NumberStyles.AllowHexSpecifier或者NumberStyles.HexNumber为第二个参数,null为第三个参数来解析十六进制字面值的字符串。你当然也应该引用System.Globalization命名空间。

这里有一点要提醒的是,无论使用Parse或者TryParse方法来解析十六进制,字符串都不能出现0x或0X前缀,否则将会抛出异常。

Q:如果我要把使用科学记数法表示的string转换为int又该如何呢?

A:你可以通过把NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent(把两个NunberStyles枚举进行位运算,其中前者说明可能存在小数点,而后者则说明可能存在科学记数法的指数符号)作为第二个参数传递给Int32类的

publicstaticintParse(strings,NumberStylesstyle);

或者

publicstaticboolTryParse(strings,NumberStylesstyle,IFormatProviderprovider,outintresult);

如果解析出来的结果与int不兼容的,就要考虑把结果储存在别的类型了。例如"1.412e2"就应该把解析结果存放到float或者double或者decimal类型的变量里,当然,你也应该使用与储存变量相对应的类型的方法来解析:

doubleresult=Double.Parse("1.412e2",NumberStyles.AllowDecimalPoint|NumberStyles.AllowExponent);

整个字符串表达式应该没有任何任何空格,否则将有可能抛出异常。

科学记数法的格式为[{+|-}]m.dddddd{e|E}[{+|-}]xx,可以分解为以下几种形式:

  • [-]m.dddddde+xx
  • [-]m.dddddde-xx
  • [-]m.ddddddE+xx
  • [-]m.ddddddE-xx

下面列举一些不能正常解析的:

  • "1.412 e3"
  • "1.412E 3"
  • "1.412e +3"
  • "141200E- 2"

Q:如何处理待解析string里所包含的空格?

A:对于字符串的前缀或后缀空格,你同样有多种选择,一般情况下,你可以直接使用String类的

publicstringTrim();

来取掉头尾可能包含的空格:

intresult=Int32.Parse(textBox1.Text.Trim());

又或者,你使用NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite来告诉Parse或TryParse待解析字符串的头尾可能包含着空格。

intresult=Int32.Parse(textBox1.Text,NumberStyles.AllowLeadingWhite|NumberStyles.AllowTrailingWhite);

如果待解析的字符串使用科学记数法来表示,那么你可以

intresult=Int32.Parse("1.412e3",NumberStyles.Float);

其中NumberStyles.Float告诉Parse方法待解析的字符串可能前缀或后缀的空格、前缀正负号、(十进制)小数点、科学记数法指数表示等。

Q:如何处理货币字符串的解析?

A:你可以通过指定NumberStyles.Currency来告诉Parse或TryParse待解析的字符串是货币样式的。NumberStyles.Currency说明待解析字符串可能包含前缀或后缀空格、前缀正负号、十进制小数点、千分位符号、字面数值可能为整数或小数等:

intresult=Int32.Parse("$1,412",NumberStyles.Currency);

但货币样式字符串不能带有任何十六进制符号。另外,货币样式字符串格式的相关设定以Region and Languages Options(区域与语言选项)里面的设定为基准。

Q:如果我更改系统的Region and Languages Options(区域与语言选项)里面的设置,但又希望不按照里面的设置来解析字符串呢?

A:这个时候就轮到NumberFormatInfo类出场了,这个类能够让你无需对系统的设置作任何修改而直接告诉相关的方法如何处理字符串里的相关符号。

对应上图,我们通过NumberFormatInfo的相关属性来设定Customerize Regional Options(自定义区域选项)中Currency(货币)选项卡里的相关设定:

NumberFormatInfo
Currency(货币)
CurrencySymbol Currency symbol(货币符号)
CurrencyPositivePattern Positive currency format(货币正数格式)
CurrencyNegativePattern Negative currency format(货币符号格式)
CurrencyDecimalSeparator Decimal symbol(小数点)
CurrencyDecimalDigits No. of digits after decimal(小数数位)
CurrencyGroupSeparator Digit grouping symbol(数字分组符号)

其中,Customerize Regional Options(自定义区域选项)中Currency(货币)选项卡里的Digit grouping(数字分组)需要结合NumberFormatInfo的CurrencyGroupSeparator和CurrencyGroupSizes两个属性来设定。而NumberFormatInfo的CurrencyPositivePattern和CurrencyNegativePattern属性的设值是有限制的:

CurrencyPositivePattern
Value
Associated Pattern
0
$n
1
n$
2
$ n
3
n $

CurrencyNegativePattern
Value
Associated Pattern
0
($n)
1
-$n
2
$-n
3
$n-
4
(n$)
5
-n$
6
n-$
7
n$-
8
-n $
9
-$ n
10
n $-
11
$ n-
12
$ -n
13
n- $
14
($ n)
15
(n $)

Q:设置好的NumberFormatInfo的实例应该怎么使用?

A:NumberFormatInfo是IFormatProvider接口的一个实现,你可以把NumberFormatInfo的实例作为参数传递给对应的重载方法。

Q:那么,Customerize Regional Options(自定义区域选项)中Numbers(数字)选项卡里的设定是否也能通过NumberFormatInfo的对应属性来设置?

A:不全是,其中Display leading zeros(零起始显示)、List separator(列表分隔符)、Measurement system(度量衡系统)这三项没有;Negative number format(负数格式)需要同时结合使用NumberFormatInfo的NegativeSign、NumberDecimalDigits、NumberDecimalSeparator等来设置;其他的都能在NumberFormatInfo中找到与之对应的属性。

Q:那么,Display leading zeros(零起始显示)、List separator(列表分隔符)、Measurement system(度量衡系统)这三项在哪里有对应的设置呢?

A:很抱歉,到目前为止我也找不到对应的地方来设置,如果你或者其他人找到了,请务必告诉我。(不过,你可以通过RegionInfo.IsMetric这个只读属性来检测当前系统是否使用Metric(公制)度量系统。)

Q:如果我无法推断待解析的字符串应该使用哪一个或多个NumberStyles枚举呢?

A:这种情况一般不会发生,待解析的字符串肯定是有一定的目的或用途的,这些目的或用途就是字符串字面样式的约束,而NumberStyles枚举的作用就是说明这种约束的。当然,如果你目前确实无法推断,那么你可以使用NumberStyles.Any枚举。

Q:在具体的编码过程中,我如何知道应该选择哪一种方法来解析字符串呢?

A:就我个人来说,我会:

  • 首先,你得清楚你所使用的CLR版本是否提供某种方法的支持,例如,TryParse是.NET 2.0或以上才支持的。
  • 其次,你可以通过方法的重载签名来选择,如果你要解析非十进制的字符串,Convert.ToInt32可能是你唯一的选择,除了十进制和十六进制,你可以用它来解析二进制、八进制,但你不能用Int32.Parse或Int32.TryParse来解释这些进制的字符串。当然如果是十进制或者十六进制就哪种方法都可以。
  • 另外,如果你需要使用NumberStyles枚举来告知相关方法待解析的字符串的样式,那么Convert.ToInt32就帮不了你了,此时你应该选择Int32.Parse或者Int32.TryParse相应的重载。
  • 再次,如果你不希望在你的代码里处理异常,那么Int32.TryParse可能是你唯一的选择,你可能根据它的返回至来判断解析是否成功,进而决定是否使用解析结果。但如果你希望透过异常机制通知调用方解析失败,那么Int32.Parse或者Convert.ToInt32都是不错的选择。
  • 最后,选择准则不可能唯一或者通用的的,你可能会在实践总结出适合你自己的选择准则,如果你有更好的选择方法,请你也告诉我一声。

Q:在.NET里面,如果要将string解析为其它的基元类型(Primitive Type)是否也有类似的方法?

A:是的,在.NET里面,我们为这些基元类型提供了Convert.ToPrimitiveTypePrimitiveType.Parse、PrimitiveType.TryParse(.NET 2.0或以上)方法,用于把string解析成对应的基元类型,当然,你得首先保证待解析的string字面值与对应的基元类型兼容。这些基元类型是(括号中是对应的C#关键字):SByte (sbyte), Byte (byte), Int16 (short), UInt16 (ushort), Int32 (int), UInt32 (uint), Int64 (long) , UInt64 (ulong), Char (char), Single (float), Double (double) , Boolean (bool), Decimal (decimal)。另外,.NET也提供了把string解析为DateTime结构的方法,除了有上面提到的三种形式(Convert.ToDateTime、DateTime.Parse、DateTime.TryParse)之外,我们还可以使用DateTime.TryParseExact。所有的这些方法都是大同小异,差别在于对字符串字面值格式(包括其所包含符号)的规定,有兴趣的话,你可以参考以下MSDN的文档或者其他专题资料。

分享到:
评论

相关推荐

    C# 逻辑表达式解析器源码

    支持操作数:int、double、bool、datetime、string 支持关键字:IF、AND、OR、NOT、TRUE、FALSE、ToString、ToDateTime、ToInt、ToDouble、Len、NowDate 详细信息参见:...

    C# xml多个同名节点操作

    方便对xml中任意节(多个同名节点)点属性进行获取、设置。... public bool SetNodeValueByIndex(XmlDocument xmlContent, string parentNode, int index,string sonNode,string grandSonNode, string valueStr)

    C#邮件接收发送解析

    能满足初学者的需要,代码理解不难.for (int i = 1; i ; i++) { string[] arrRets = PopMail(tcpclient, i); Email.POP3.EmailMessage objEmail = objPOP3.GetMessage(i, false); richEmailsInfo.AppendText("=...

    C#读取JPEG图片的Exif信息

    public string GetEXIFProperty(Definitions.exifCode exifCode) { // Declare local variables. string returnValue; try { // All of the EXIF properties will return strings to display in the control...

    C#坦克大战网络版代码

    public void Send(UdpClient uc, string ip, int udpPort) { uc.Connect(ip, udpPort); //程序中用 | 来分割发送的内容 string str = msgType + "|" + tank.ID + "|" + tank.x + "|" + tank.y + "|" + (int)...

    C#微软培训资料

    超越今天各自为营的超越今天各自为营的 超越今天各自为营的 Web 站点 站点站点 站点 把 把把 把 Internet 建成一 建成建成 建成 个 一个一 一个可 可个可 可 以互相交换组件的地方 以互相...

    JVM系列之String.intern的性能解析

    String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字符串的数量,推荐尽量直接使用String Table中的字符串常量池中的元素。 那么String.intern的性能怎么样呢?我们一起来看一下。 String.intern...

    解析空中三角测量

    解析空中三角测量C#代码 private void 导入像点坐标数据ToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog FILE = new OpenFileDialog(); FILE.Filter = "文本文件(*.txt)|*.txt| 所有文件...

    解析C#编程的通用结构和程序书写格式规范

    C# 程序的通用结构 C# 程序可由一个或多个文件组成。每个文件都可以包含零个或零个以上的命名空间。一个命名空间除了可包含其他命名空间外,还可包含类、结构、接口、枚举、委托等类型。以下是 C# 程序的主干,它...

    C#聊天程序

    /// 要解析的包含命令的byte数组,只提取前两个字节 /// 拼接成的命令 private string DecodingBytes(byte[] s) { return string.Concat(s[0].ToString(), s[1].ToString()); } /// /// 线程执行体,转发...

    wp7 表情解析

    wp7 表情 解析 算法 public static List<OutputObject> KMPParseMessageText(string original) { int keyIndex = 0; List<OutputObject> newOutData = null; do { int firstPosition = original.IndexOf...

    FileParser:C#文件解析器(.NET标准)

    FileParser FileParser是一个.NET库,旨在逐行读取文本文件,将每行的内容保存为基本类型vars(int,double,string等)。 直到v1.4.x为止,都支持.NET Framework 4.6。 在v1.6.x之前支持.NET Standard 2.0和2.1。 ...

    C#浏览器编程,学习使用

    5) 解释程序把 HTML 规格转换为适合用户显示硬件的命令来处理版面的细节。 6) 许多浏览器还包含 FTP 客户,用来获取文件传送服务。 7) 一些浏览器也包含电子邮件客户,使浏览器能够发送和接收电子邮件 8) 浏览器将...

    C#类的创建与初始化实例解析

    本文以一个实例简单实现了类的创建与初始化,实现代码如下所示: using System; using System.Collections.Generic;... //因为Age和Gender也没有赋值,而它两是int类型的,所以他们两个的默认值为0 publ

    C#入门之checked和unchecked的区别实例解析

    本文以实例形式对比测试了C#中checked和unchecked的区别,对于C#初学者来说有很好的借鉴参考价值。具体分析如下: int类型的最大值是2147483647,2个最大值相加就会超出int的最大值,即出现溢出。 class Program ...

    C#泛型和反射实例解析

    C#中的泛型和反射经常是一起工作的,因此这里就一次性的加以介绍了。 由于c#是强类型语言,一般来说函数的返回类型和参数的类型都是一早写好的,这也就造成了很多时候不像js那样方便使用,不够灵话。 因此就有了这个...

    CommandLine:不仅用于解析命令行参数的库,还用于使标准C#方法可从命令行调用的库

    介绍该项目是.NET的命令行... 例如,如果我有一个名为ProcessItems的方法,该方法带有两个参数:一个int batchSize和一个bool waitBetweenBatches那么除了: public class Program{ public static void Main ( string

    c#实现flv解析详解示例

    先上效果图:   工具类 在解析的过程中,我们会和byte做各种运算,所以我定义了一个byte工具类...namespace FLVParer.Utils{ class ByteUtils { public static uint ByteToUInt(byte[] bs, int length) { 

    asp.net(C#)解析Json的类代码

    本次工作内容是要将以下数据解析成.Net可以使用的数据,返回的数据除了header,其他的都是可变的,也就是说结构不是固定的。完全由用户选择,所以选择了...{ “assetId”:”string”, “serverIdcId”:”int”, “input

    c# eval 函数

    new EvaluatorItem(typeof(int), "(30 + 4) * 2", "GetNumber"), new EvaluatorItem(typeof(string), "\"Hello \" + \"There\"", "GetString"), new EvaluatorItem(typeof(bool), "30 == 40", "GetBool"), new...

Global site tag (gtag.js) - Google Analytics