一、分析字符串
Parse 方法将表示 .NET Framework 基类型的字符串转换为实际的 .NET Framework 基类型。由于分析是格式化(将基类型转换为字符串表示形式)的反转操作,格式化的许多规则和约定也适用于分析。正如格式化使用实现 IFormatProvider 接口的对象将信息格式化为字符串一样,分析使用实现 IFormatProvider 接口的对象来确定如何解释字符串表示形式。有关更多信息,请参见格式化概述。
二、分析数值字符串
所有的数字类型都有一个静态 Parse 方法,可用于将数字类型的字符串表示形式转换为实际的数字类型。这些方法可用于分析那些使用格式化类型一节中提及的格式设置说明符之一产生的字符串。
用于表示货币符号、千位分隔符和小数点的字符均在格式提供程序中定义。Parse 方法接受格式提供程序,允许您指定和显式分析特定区域性字符串。如果未指定格式提供程序,则使用与当前线程关联的提供程序。有关更多信息,请参见格式化概述。
下面的代码示例将字符串转换为整数值,增加该值,并显示结果。
C# |
复制代码 |
string MyString = "12345"; int MyInt = int.Parse(MyString); MyInt++; Console.WriteLine(MyInt); // The result is "12346". |
如果要将包含非数值字符的字符串转换为 .NET Framework 的 numeric 基类型,NumberStyles 枚举将十分有用。可使用此枚举来分析包含货币符号、小数点、指数、括号等的字符串。例如,在 en-US 区域性中,如果未传递 NumberStyles.AllowThousands 枚举,则无法使用 Parse 方法将包含逗号的字符串转换成整数值。
NumberStyles.AllowCurrencySymbol 指定应将数字分析为货币而不是小数。NumberStyles.AllowDecimalPoint 表示允许使用小数点。有效小数点字符由当前 NumberFormatInfo 对象的 NumberDecimalSeparator 或 CurrencyDecimalSeparator 属性决定。NumberStyles.AllowThousands 表示允许使用组分隔符。有效组分隔符字符由当前 NumberFormatInfo 对象的 NumberGroupSeparator 或 CurrencyGroupSeparator 属性决定。有关有效的非数值字符类型的完整列表,请参见 NumberStyles 枚举文档。
NumberStyles 枚举使用当前区域性指定的字符来辅助分析。如果没有通过将 CultureInfo 对象集传递至对应于所分析的字符串的区域性来指定区域性,则将使用与当前线程相关联的区域性。
下面的代码示例无效,并将引发异常。它解释了用于分析包含非数值字符的字符串的错误方法。首先创建一个新的 CultureInfo,并将其传递给 Parse 方法,以指定使用 en-US 区域性来进行分析。
C# |
复制代码 |
using System.Globalization; CultureInfo MyCultureInfo = new CultureInfo("en-US"); string MyString = "123,456"; int MyInt = int.Parse(MyString, MyCultureInfo); Console.WriteLine(MyInt); // Raises System.Format exception. |
应用具有 AllowThousands 标志的 NumberStyles 枚举时,Parse 方法将忽略前面示例中引发异常的逗号。下面的代码示例使用与前面示例相同的字符串,但未引发异常。与前面的示例相似,首先创建一个新的 CultureInfo,并将其传递给 Parse 方法,以指定使用 en-US 区域性所用的千位分隔符来进行分析。
C# |
复制代码 |
using System.Globalization; CultureInfo MyCultureInfo = new CultureInfo("en-US"); string MyString = "123,456"; int MyInt = int.Parse(MyString, NumberStyles.AllowThousands, MyCultureInfo); Console.WriteLine(MyInt); // The result is "123456". |
三、分析日期和时间字符串
与数字类型相似,DateTime 对象具有将字符串转换为 DateTime 对象的功能。Parse 方法和 ParseExact 方法均可用于将日期或时间的字符串表示形式转换为 DateTime 对象。Parse 方法可转换任何有效的字符串表示形式,而 ParseExact 方法只转换采用您指定的格式的字符串。这两种方法均可成功转换格式为标准 DateTime 模式(在日期与时间格式字符串一节中描述)之一的任何字符串。
用于表示月、日名称的值,以及 DateTime 组件的显示顺序,均在格式提供程序中定义。Parse 和 ParseExact 方法都接受格式提供程序,允许指定和显式分析特定区域性字符串。如果未指定格式提供程序,则使用与当前线程关联的提供程序。有关更多信息,请参见格式化概述。
默认情况下,传递的字符串中不包含的任何有关日期或时间的信息都用来自 DateTime.Now 的当前日期和时间信息填充。例如,如果分析字符串“1/1/00”,则仅指定 DateTime 的 Month、Year 和 Day 属性。其他属性(如 Minutes、Seconds 和 Ticks)设置为 DateTime.Now 指定的当前值。通过指定 DateTimeStyles.NoCurrentDateDefault 可以修改此行为,但这会导致 Year、Month 和 Day 均设置为“1”而不是当前的年、月、日。
分析
下面的代码示例阐释如何使用 Parse 方法将字符串转换为 DateTime。此示例使用与当前线程相关的区域性来执行分析。如果与当前区域性相关的 CultureInfo 无法分析输入的字符串,则会引发 FormatException。
C# |
复制代码 |
string MyString = "Jan 1, 2002"; DateTime MyDateTime = DateTime.Parse(MyString); Console.WriteLine(MyDateTime); |
还可以将 CultureInfo 集合指定为由该对象定义的某一区域性设置。下面的代码示例使用格式提供程序将德语字符串分析为 DateTime 对象。表示 de-DE 区域性的 CultureInfo 经过定义后,与被分析的字符串一起传递,这样可确保成功分析此特定字符串。这样就排除了 CurrentThread 的 CurrentCulture 中的任何设置。
C# |
复制代码 |
using System.Globalization; CultureInfo MyCultureInfo = new CultureInfo("de-DE"); string MyString = "12 Juni 2002"; DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo); Console.WriteLine(MyDateTime); |
下面的代码示例使用 DateTimeStyles 枚举来指定当前日期和时间信息不应添至字符串未定义的字段的 DateTime。
C# |
复制代码 |
using System.Globalization; CultureInfo MyCultureInfo = new CultureInfo("de-DE"); string MyString = "12 Juni 2002"; DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo, DateTimeStyles.NoCurrentDateDefault); Console.WriteLine(MyDateTime); |
ParseExact
ParseExact 方法只将指定的字符串模式转换为 DateTime。向此方法传递非指定格式的字符串时,会引发 FormatException。您可以指定一种标准日期和时间格式说明符,或指定自定义日期和时间格式说明符的限定组合。使用自定义格式说明符,可以构造自定义识别字符串。有关说明符的解释,请参见日期与时间格式字符串一节。
在下面的代码示例中,依次将字符串对象、格式说明符、CultureInfo 对象传递至 ParseExact 方法进行分析。此 ParseExact 方法只能分析在 en-US 区域性中显示长日期模式的字符串。
C# |
复制代码 |
using System.Globalization; CultureInfo MyCultureInfo = new CultureInfo("en-US"); string MyString = " Tuesday, April 10, 2001"; DateTime MyDateTime = DateTime.ParseExact(MyString, "D", MyCultureInfo); Console.WriteLine(MyDateTime); |
四、分析其他字符串
除数值字符串和 DateTime 字符串外,还可以分析将 Char、Boolean 和 Enum 类型表示为数据类型的字符串。
Char
如果要将包含单个字符的字符串转换为其 Unicode 值,与 Char 数据类型相关的静态分析方法十分有用。下面的示例代码将字符串分析为 Unicode 字符。
C# |
复制代码 |
string MySTring = "A"; char MyChar = Char.Parse(MyString); // MyChar now contains a Unicode "A" character. |
Boolean
Boolean 数据类型包含 Parse 方法,此方法可用于将表示 Boolean 值的字符串转换为实际 Boolean 类型。此方法不区分大小写,可成功分析包含“True”或“False”字符的字符串。与 Boolean 类型相关的 Parse 方法还可以分析周围有空格的字符串。如果传递任何其他字符串,将引发 FormatException。
下面的代码示例使用 Parse 方法将字符串转换为 Boolean 值。
C# |
复制代码 |
string MyString = "True"; bool MyBool = bool.Parse(MyString); // MyBool now contains a True Boolean value. |
枚举
您可以使用静态 Parse 方法将 Boolean 类型初始化为字符串的值。此方法接受正在分析的枚举类型、要分析的字符串和指明分析是否区分大小写的可选 Boolean 标志。分析的字符串可包含几个用逗号隔开的值,值的前后可留有一个或多个空格。当字符串包含多个值时,返回对象的值是所有与按位“或”运算组合的指定值。
下面的示例使用 Parse 方法将字符串表示形式转换为枚举值。DayOfWeek 枚举从字符串中初始化为 Thursday。
C# |
复制代码 |
string MyString = "Thursday"; DayOfWeek MyDays = (DayOfWeek)DayOfWeek.Parse(typeof(DayOfWeek), MyString); Console.WriteLine(MyDays); //The result is Thursday. |
1