C#: Convert to Int —— (int)/Int32.Parse/Convert.ToInt32 区别
问题:
在将小数、字符串转换成整数(int)类型时,会有取整,四舍五入等多种需求;转换方式也有显式转换、函数转换等多种方式。
1. 显式转换(int)
示例:
double value = 1.72;
int n = (int)value; // n=1;
double value = 1.32;
int n = (int)value; // n=1;
作用:
将 double 或 float 值转换为整型时,值会被截断(取整)。
如果该结果整数值超出了目标值的范围,其结果将取决于溢出检查上下文。
不足:
无法直接对String类型进行显式转换。
问题:
可能是因为计算精度问题,下面表达式并不是截断取值。
double value = 1.9999999999999999;
int n = (int)value; //n=2;
2. Int32.Parse
String 类型不可以通过显示转换来完成。那么如何将 String 类型转换成 int ?
示例:
int number = Int32.Parse(" 179 "); //179
int number = Int32.Parse(" -204 "); //-204
作用:
可以通过 Int32.Parse 来完成转换,但必须符合以下表达式,否则将会报 FormateException 错误:
[ws][sign]digits[ws]
|
Element |
Description |
|
ws |
Optional white space. |
|
sign |
An optional sign. |
|
digits |
A sequence of digits ranging from 0 to 9. |
Pasted from <http://msdn.microsoft.com/en-us/library/b3h1hf19.aspx>
可见 String 中只能包含整数。
不足:
从上面表达式中可以看出,Int32.Parse只可以将 String 转换为 int,而且 String中不可以包含小数点“.”。
int number = Int32.Parse(" 178.3 "); //FormateException.
如果需要转换带小数点“.”,可以使用 NumberStyles.AllowDecimalPoint ,但是小数点后面只可以是“0”:
Int32.Parse("179.0", NumberStyles.AllowDecimalPoint); //179
Int32.Parse("179.01", NumberStyles.AllowDecimalPoint); //OverflowException
Int32.Parse("-179.0", NumberStyles.AllowDecimalPoint); //FormateException
Pasted from <http://msdn.microsoft.com/zh-cn/library/c09yxbyt.aspx>
问题:
Int32.Parse 对String 的格式有要求,如果不符合要求就会抛出异常。避免经常抛出异常,可以提前使用 Int32.TryParse 来判断是否可以进行转换。
int number;
bool result = Int32.TryParse("9432.0",
out number);//False
Pasted from <http://msdn.microsoft.com/en-us/library/f02979c7.aspx>
3.Convert.ToInt32
(int)可以对小数进行转换,Int32.Parse 可以对 String 进行转换,两种方法各有各的优势。
有没有什么方法可以同时转换这两种类型?目前为止还没有方法可以进行四舍五入的转换,是否能够实现?
String 类型转换——Convert.Int32(String)
实现:
public static int ToInt32(string value)
{
if (value == null)
{
return 0;
}
return int.Parse(value, CultureInfo.CurrentCulture);
}
作用:
从实现方法中可以看出, Convert.Int32(String) 和 Int32.Parse(String) 是一样的功能。
不足:
如果需要将 String 中的小数转换成 int ,需要先将String转换成Double(Convert.ToDouble(String)),然后再转换成 int(Convert.ToInt32(Double))。
小数转换成 int ——Convert.Int32(Double)
示例:
Convert.ToInt32(4.5);//4
Convert.ToInt32(5.5);//6
Convert.ToInt32(-4.5);//-4
Convert.ToInt32(-5.5);//-6
Convert.ToInt32(103.919);//104
Convert.ToInt32(17834.191);//17834
Convert.ToInt32(-1023.299);//-1023
Convert.ToInt32(-103.69);//-104
实现:
public static int ToInt32(double value)
{
if (value >= 0.0)
{
if (value < 2147483647.5)
{
int num = (int)value;
double num2 = value - num;
if ((num2 > 0.5) || ((num2 == 0.5) && ((num & 1) != 0)))
{
num++;
}
return num;
}
}
else if (value >= -2147483648.5)
{
int num3 = (int)value;
double num4 = value - num3;
if ((num4 < -0.5) || ((num4 == -0.5) && ((num3 & 1) != 0)))
{
num3--;
}
return num3;
}
throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
}
作用:
从代码中可以清楚的看到,Convert.Int32(Double) 并不是简单的将小数位截断,但也不是简单的四舍五入。
((num2 == 0.5) && ((num & 1) != 0))——当小数为0.5时,如果整数位是奇数就入,如果整数位是偶数就舍。所以可以简单的归纳为:四舍六入五凑偶。
不足:
该方法未能实现四舍五入。而是根据IEEE标准实现 bankers' rounding 规则。
WIKI Link <http://en.wikipedia.org/wiki/Rounding>
总结:
将小数、字符串转换成整数(int)类型时:
如果需要将小数位都截断,可使用(int);
如果需要将整数型字符串转换成 int ,可使用 Int32.Parse 或者 Convert.Int32(String);
如果需要实现四舍六入五凑偶,可使用 Convert.Int32(Double);
如果需要实现四舍五入,需自己写方法。
四舍五入算法参考:
//4.5 -> 5
//-4.5 -> -5; 如果希望 -4.5-> -4,可自行修改。
if (value >= 0.0)
{
if (value < 2147483647.5)
{
int num = (int)value;
double num2 = value - num;
if (num2 >= 0.5)
{
num++;
}
return num;
}
}
else if (value >= -2147483648.5)
{
int num3 = (int)value;
double num4 = value - num3;
if ((num4 <= -0.5))
{
num3--;
}
return num3;
}
附录显式转换列表:
|
From |
To |
|
byte, ushort, uint, ulong, or char |
|
|
Sbyte or char |
|
|
sbyte, byte, ushort, uint, ulong, or char |
|
|
sbyte, byte, short, or char |
|
|
sbyte, byte, short, ushort, uint, ulong,or char |
|
|
sbyte, byte, short, ushort, int, or char |
|
|
sbyte, byte, short, ushort, int, uint, ulong, or char |
|
|
sbyte, byte, short, ushort, int, uint, long, or char |
|
|
sbyte, byte, or short |
|
|
sbyte, byte, short, ushort, int, uint, long, ulong, char,or decimal |
|
|
sbyte, byte, short, ushort, int, uint, long, ulong, char, float,or decimal |
|
|
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, or double |
浙公网安备 33010602011771号