Java 字符串转整数主要涉及两个方法:parseInt() 与 parseLong()。
String to int
有多种方式可以将字符串转换为 int 或 Integer 。
构造器
Integer 的构造器支持传入一个字符串:
Integer v1 = new Integer("010");
System.out.println(v1);
实际上,在内部它是通过 Integer.parseInt() 方法来实现的。
Integer.parseInt() 方法
parseInt() 方法以两种形式重载:
- public static int parseInt(String s) throw NumberFormatException {…}
- public static int parseInt(String s, int radix) throw NumberFormatException {…}
参数字符串是null或字符串长度为零,即空字符串,这两种方法都抛出NumberFormatException。
当字符串不是10为基数的可解析整数时,第一种方法也会引发异常。
radix 表示进制,常见的进制如 二进制、八进制、十进制、十六进制等。
public static void main(String[] args) {
int v1 = Integer.parseInt("111");
System.out.println(v1);
int v2 = Integer.parseInt("010");
System.out.println(v2);
int v3 = Integer.parseInt("");
}
10
Exception in thread “main” java.lang.NumberFormatException: For input string: “”
public static void main(String[] args) {
int v1 = Integer.parseInt("110");
System.out.println(v1);
int v2 = Integer.parseInt("110",8);
System.out.println(v2);
int v3 = Integer.parseInt("110",16);
System.out.println(v3);
}
72
272
Integer.valueOf() 方法
valueOf()
方法与 parseInt()
方法非常相似,只有一个区别是返回类型是Integer而不是 int。实际上,如果你查看valueOf()方法的源代码,会发现它会在内部调用parseInt()方法。
valueOf()
也以两种形式重载:
public static Integer valueOf(String s) throws NumberFormatException {...}
public static Integer valueOf(String s, int radix) throws NumberFormatException {...}
利用valueOf()
将字符串转换为 Integer:
public static void main(String[] args) {
Integer v1 = Integer.valueOf("1230");
System.out.println(v1);
Integer v2 = Integer.valueOf("0120");
System.out.println(v2);
Integer v3 = Integer.valueOf("");
}
120
Exception in thread “main” java.lang.NumberFormatException: For input string: “”
Integer.decode() 方法
decode()
也可以将字符串转换为 int ,它适用于十进制、十六进制和八进制数。
- 八进制数应以可选的加号/减号开头,然后是“0”,即 +0100、-02022、0334、0404 等。
- 十进制数字应以可选的加号/减号开头,即 +100、-2022、334、404 等。
- 十六进制数字应以可选的加号/减号开头,然后是“0x”或“0X”,即 +0x100、-0x2022、0x334、0x404 等。
decode()
方法定义:
public static Integer decode(String nm) throws NumberFormatException
decode()
支持常见的三种进制数,在内部,它调用 valueOf()
将字符串转换为对应的整数形式。
public static void main(String[] args) {
// 十进制
Integer v1 = Integer.decode("1230");
System.out.println(v1);
// 八进制
Integer v2 = Integer.decode("+0110");
System.out.println(v2);
// 十六进制
Integer v3 = Integer.decode("+0x110");
System.out.println(v3);
}
72
272
String to long
与字符串转 int 类似,字符串转为 long 也有多种形式:
构造函数
Long v1 = new Long("+11");
实际上,在内部他是通过 parseLong(String)
来实现的。
Long.parseLong(String) 静态方法
parseLong
有两个重载形式:
public static long parseLong(String s) throws NumberFormatException
public static long parseLong(String s, int radix) throws NumberFormatException
参数字符串是null或字符串长度为零,即空字符串,这两种方法都抛出NumberFormatException。
当字符串不是10为基数的可解析整数时,第一种方法也会引发异常。
radix 表示进制,常见的进制如 二进制、八进制、十进制、十六进制等。
public static void main(String[] args) {
long v1 = Long.parseLong("029");
System.out.println(v1);
long v2 = Long.parseLong("+333");
System.out.println(v2);
long v3 = Long.parseLong("-020");
System.out.println(v3);
}
Long.valueOf(String) 静态方法
- Long.valueOf(String)方法将string参数解析为有符号十进制长整型。
- 字符串中的字符必须都是十进制数字,除了第一个字符可以是负数的减号 (-)和正数的加号 (+)号。
与parseLong
想必,该方法仅仅返回值是 Long。在内部,valueOf() 是通过parseLong
来实现的。
将正数转换为 long,前面的 +
会省略,负数会保留-
。
public static void main(String[] args) {
Long v1 = Long.valueOf("012");
System.out.println(v1);
Long v2 = Long.valueOf("+120");
System.out.println(v2);
Long v3 = Long.valueOf("-99");
System.out.println(v3);
}
120
-99
parseUnsignedLong 无符号
除了我们常见的整数,还有一个一种 UnsignedLong,被称之为无符号长整形。
Long 的范围是[-2^63,2^63-1],UnsignedLong 的范围是[0,2^64-1],它不能表示负数。
public static void main(String[] args) {
long v1 = Long.parseUnsignedLong("+100");
System.out.println(v1);
long v2 = Long.parseUnsignedLong("-100"); //java.lang.NumberFormatException
}
将负数进行解析,会抛出NumberFormatException。
关于 NumberFormatException
字符串转换为整数,必须要入参字符串是标准的数值,否则容易抛出NumberFormatException。因此,实际开发中,应该将代码保留在 try-catch
块中,以避免应用程序中出现任何奇怪的行为。
你可能会直接用下面的代码来转换字符串为整数:
int intVal = Integer.parseInt("a123");//java.lang.NumberFormatException
System.out.println(intVal);
确保解析的动作能被合理处理:
public static void main(String[] args) {
try {
int intVal = Integer.parseInt("a123");//java.lang.NumberFormatException
System.out.println(intVal);
}catch (NumberFormatException e){
System.out.println("字符串解析失败 " + e.getMessage());
}
}