Q
:如何把
string
解析为
int
?
A
:简单的方法有三种:
string
source = "1412";
int result = 0;
// 使用 Convert.ToInt32(string value);
result = Convert.ToInt32(source);
// 使用 Int32.Parse(string value);
result = Int32.Parse(source);
// 使用 Int32.TryParse(string s, out int result);
Int32.TryParse(source, out result);
int result = 0;
// 使用 Convert.ToInt32(string value);
result = Convert.ToInt32(source);
// 使用 Int32.Parse(string value);
result = Int32.Parse(source);
// 使用 Int32.TryParse(string s, out int result);
Int32.TryParse(source, out result);
Q
:这三种方法有什么不同?
A
:一个简单的回答是:
如果解析失败,
Int32.Parse(source)
总会抛出异常;
Convert.ToInt32(source)
在
source
为
null
的情况下不会抛出异常而是简单的返回
0
给调用方;而
Int32.TryParse(source, result)
则无论如何都不抛出异常,只会返回
true
或
false
来说明解析是否成功,如果解析失败,调用方将会得到
0
值。
Q
:如果我要解析的字符串的字面数值不是十进制的话,那么从这些方法中得到的返回值是有问题的。有什么方法解决?
A
:那么你就需要这些方法的对应重载版本了,一个简单的方法是使用
Convert
类的
public
static
int
ToInt32(
string
value,
int
fromBase);
其中
fromBase
的值只能为
2
、
8
、
10
或者
16
,用于指定进制方式。如果
fromBase
不是指定的数值或者
value
不为十进制而又带有前缀正负号,就会抛出
ArgumentException
。
string
source = "0x1412";
//
这里的
0x
(或
0X
)前缀是可选的。
int result = Convert.ToInt32(source, 16);
int result = Convert.ToInt32(source, 16);
当然,你还可以通过为
Int32
类的
public
static
int
Parse(
string
s, NumberStyles style);
指定
NumberStyles.AllowHexSpecifier
或者
NumberStyles.HexNumber
为第二个参数来解析十六进制字面值的字符串,此时,你需要引用
System.Globalization
命名空间。
或者使用
Int32
类的
public
static
bool
TryParse(
string
s, NumberStyles style, IFormatProvider provider,
out
int
result);
并指定
NumberStyles.AllowHexSpecifier
或者
NumberStyles.HexNumber
为第二个参数,
null
为第三个参数来解析十六进制字面值的字符串。你当然也应该引用
System.Globalization
命名空间。
这里有一点要提醒的是,无论使用
Parse
或者
TryParse
方法来解析十六进制,字符串都不能出现
0x
或
0X
前缀,否则将会抛出异常。
Q
:如果我要把使用科学记数法表示的
string
转换为
int
又该如何呢?
A
:你可以通过把
NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent
(把两个
NunberStyles
枚举进行位运算,其中前者说明可能存在小数点,而后者则说明可能存在科学记数法的指数符号)作为第二个参数传递给
Int32
类的
public
static
int
Parse(
string
s, NumberStyles style);
或者
public
static
bool
TryParse(
string
s, NumberStyles style, IFormatProvider provider,
out
int
result);
如果解析出来的结果与
int
不兼容的,就要考虑把结果储存在别的类型了。例如
"1.412e2"
就应该把解析结果存放到
float
或者
double
或者
decimal
类型的变量里,当然,你也应该使用与储存变量相对应的类型的方法来解析:
double
result = 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
类的
public
string
Trim();
来取掉头尾可能包含的空格:
int
result = Int32.Parse(textBox1.Text.Trim());
又或者,你使用
NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite
来告诉
Parse
或
TryParse
待解析字符串的头尾可能包含着空格。
int
result = Int32.Parse(textBox1.Text, NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite);
如果待解析的字符串使用科学记数法来表示,那么你可以
int
result = Int32.Parse(" 1.412e3 ", NumberStyles.Float);
其中
NumberStyles.Float
告诉
Parse
方法待解析的字符串可能前缀或后缀的空格、前缀正负号、(十进制)小数点、科学记数法指数表示等。
A
:你可以通过指定
NumberStyles.Currency
来告诉
Parse
或
TryParse
待解析的字符串是货币样式的。
NumberStyles.Currency
说明待解析字符串可能包含前缀或后缀空格、前缀正负号、十进制小数点、千分位符号、字面数值可能为整数或小数等:
int
result = Int32.Parse(" $1,412 ", NumberStyles.Currency);
但货币样式字符串不能带有任何十六进制符号。另外,货币样式字符串格式的相关设定以
Region and Languages Options
(区域与语言选项)里面的设定为基准。