如何将字符串转化成基本类型
在日常开发中,我们一般都会把字符串byte
, short
, int
, long
, float
, double
,这些类型然后在做一些操作。
我们一般用parse
方法 例如 Integer.parseInt
下面是java
的Number
自带的方法
java.lang.Byte
public static byte parseByte(String s) throws NumberFormatException
java.lang.Short
public static short parseShort(String s) throws NumberFormatException
java.lang.Integer
public static int parseInt(String s) throws NumberFormatException
java.lang.Long
public static long parseLong(String s) throws NumberFormatException
java.lang.Float
public static float parseFloat(String s) throws NumberFormatException
java.lang.Double
public static double parseDouble(String s) throws NumberFormatException
我们举一个例子来验证下,就来测试下String
转int
public class Example1 {
public static void main(String[] args) {
int i = Integer.parseInt("54");
System.out.println(i);
}
}
得到的结果:
54
但是一般情况下它是不安全的,毕竟每个都抛出throws NumberFormatException
,例如下面?
public class Example2 {
public static void main(String[] args) {
String intString = "five";
int i = Integer.parseInt(intString);
System.out.println(i);
}
}
得到的结果:
ava.lang.NumberFormatException: For input string: "five"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at com.logicbig.example.Example2.main(Example2.java:5)
如何操作能安全的得到字符串得到数字。
第一种,我们去捕获java.lang.NumberFormatException
异常,例如下面的做法
public class Example3 {
public static void main(String[] args) {
int i = parseStringToInt("five", -1);
System.out.println(i);
}
private static int parseStringToInt(String input, int defaultValue){
try {
return Integer.parseInt(input);
} catch (NumberFormatException e) {
return defaultValue;
}
}
结果:
-1
这样如果转换出问题,我们就可以得到默认值-1
。
第二种,我们在转换之前先用正则判断一下是否满足。例如下面?
public class Example4 {
public static void main(String[] args) {
int i = parseToInt("5", -1);
System.out.println(i);
i = parseToInt("05", -1);
System.out.println(i);
i = parseToInt("000", -1);
System.out.println(i);
i = parseToInt("-5", -1);
System.out.println(i);
i = parseToInt("+5", -1);
System.out.println(i);
i = parseToInt("-", -1);
System.out.println(i);
i = parseToInt("five", -1);
System.out.println(i)
}
private static int parseToInt(String input, int defaultInt) {
System.out.printf("Input: '%s'%n", input);
if (input == null) {
return defaultInt;
} else if (input.matches("[-+]?\\d+")) {
return Integer.parseInt(input);
} else
return defaultInt;
}
}
}
结果:
Input: '5'
5
Input: '05'
5
Input: '000'
0
Input: '-5'
-5
Input: '+5'
5
Input: '-'
-1
Input: 'five'
-1
但是这样就安全了吗?如果是Integer.parseInt("2147483648");
通过使用Apache lang NumberUtils
pom.xml
org.apache.commonscommons-lang33.10
import org.apache.commons.lang3.math.NumberUtils;
public class Example5 {
public static void main(String[] args) {
int i = NumberUtils.toInt("5", 0);
System.out.println(i);
i = NumberUtils.toInt("-5", 0);
System.out.println(i);
i = NumberUtils.toInt("+5", 0);
System.out.println(i);
i = NumberUtils.toInt("05", 0);
System.out.println(i);
i = NumberUtils.toInt("five", 0);
System.out.println(i);
}
}
结果:
5
-5
5
5
0
NumberUtils
提供了如下方法
public static byte toByte(final String str, final byte defaultValue) public static short toShort(final String str, final short defaultValue) public static int toInt(final String str, final int defaultValue) public static long toLong(final String str, final long defaultValue) public static float toFloat(final String str, final float defaultValue) public static double toDouble(final String str, final double defaultValue)
上面的方法其实就是帮我做了捕获异常。下面是源码。
public static double toDouble(final String str, final double defaultValue) {
if (str == null) {
return defaultValue;
}
try {
return Double.parseDouble(str);
} catch (final NumberFormatException nfe) {
return defaultValue;
}
}