Java String 转 Double
1. 前言
在Java编程中,我们经常需要将字符串转换为Double类型。这在处理用户输入、读取文件或者进行数值计算等情况下非常常见。本文将详细介绍将字符串转换为Double类型的不同方法,并提供示例代码以演示每种方法的使用。
2. 使用 Double 类的 parseDouble() 方法
Java的Double
类提供了一个静态方法parseDouble()
,可以将字符串转换为Double类型。例如:
String str = "3.14";
double num = Double.parseDouble(str);
System.out.println(num);
上述代码将字符串”3.14″转换为Double类型,并将结果赋值给num
变量。输出为:
3.14
需要注意的是,parseDouble()
方法要求传入的字符串必须是表示合法的浮点数。如果字符串无法转换为Double类型,将抛出NumberFormatException
异常。例如:
String str = "abc";
double num = Double.parseDouble(str);
运行上述代码将抛出异常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at Main.main(Main.java:5)
为了避免异常的抛出,我们在使用parseDouble()
方法前应该进行合法性检查。例如,可以使用正则表达式检查输入字符串是否表示一个浮点数:
String str = "abc";
if (str.matches("-?\\d+(\\.\\d+)?")) {
double num = Double.parseDouble(str);
System.out.println(num);
} else {
System.out.println("输入字符串不合法");
}
输出为:
输入字符串不合法
3. 使用 Double 对象的 valueOf() 方法
Double
类还提供了另一个静态方法valueOf()
,可以将字符串转换为Double对象。与parseDouble()
方法不同的是,valueOf()
方法返回一个Double对象,而不是一个原始的double类型。使用方法如下:
String str = "3.14";
Double numObj = Double.valueOf(str);
System.out.println(numObj);
输出为:
3.14
在这个示例中,字符串”3.14″被转换为一个Double对象,并赋值给numObj
变量。虽然numObj
的类型是Double
而不是double
,但我们仍然可以对它进行数值计算等操作。需要注意的是,valueOf()
方法也会抛出NumberFormatException
异常,因此在使用时需要进行合法性检查。
同时,valueOf()
方法还有一个重载版本,可以指定进制参数。例如,我们可以将一个表示二进制数的字符串转换为Double对象:
String binaryStr = "101.01";
Double numObj = Double.valueOf(binaryStr, 2);
System.out.println(numObj);
输出为:
5.25
4. 使用 DecimalFormat 类进行格式化转换
除了使用Double类的方法进行字符串转换外,我们还可以使用DecimalFormat
类来实现字符串到Double类型的转换。DecimalFormat
类位于java.text
包中,它允许我们按照指定的格式解析字符串。
下面是一个示例代码:
import java.text.DecimalFormat;
String str = "123.45";
DecimalFormat decimalFormat = new DecimalFormat();
double num = decimalFormat.parse(str).doubleValue();
System.out.println(num);
输出为:
123.45
在这个示例中,我们不需要对输入字符串进行合法性检查,DecimalFormat
类会自动忽略字符串中的非法字符。
需要注意的是,如果使用了自定义格式(如指定了千位分隔符、货币符号等),DecimalFormat
在解析输入字符串时需要与格式匹配。如果输入字符串无法匹配指定格式,将抛出ParseException
异常。因此,在使用DecimalFormat
类进行字符串转换时,我们需要确保输入字符串与格式是一致的。
5. 性能比较
在选择使用哪种方法将字符串转换为Double类型时,性能也是我们需要考虑的一个因素。在相同的输入条件下,我们可以编写一个简单的基准测试来比较各种方法的性能。
下面是一个示例代码,测试了之前介绍的三种方法及其性能:
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
int iterations = 1000000;
String str = "3.14";
// 方法1:Double.parseDouble()
long start1 = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
double num = Double.parseDouble(str);
}
long end1 = System.currentTimeMillis();
System.out.println("Double.parseDouble() 执行时间:" + (end1 - start1) + "ms");
// 方法2:Double.valueOf()
long start2 = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
Double numObj = Double.valueOf(str);
}
long end2 = System.currentTimeMillis();
System.out.println("Double.valueOf() 执行时间:" + (end2 - start2) + "ms");
// 方法3:DecimalFormat
long start3 = System.currentTimeMillis();
DecimalFormat decimalFormat = new DecimalFormat();
for (int i = 0; i < iterations; i++) {
double num = decimalFormat.parse(str).doubleValue();
}
long end3 = System.currentTimeMillis();
System.out.println("DecimalFormat 执行时间:" + (end3 - start3) + "ms");
}
}
这段代码首先定义了一个循环次数iterations
,设置为1000000次。然后使用三种不同的方法将字符串”3.14″转换为Double类型,并重复执行该转换iterations
次。最后,输出每种方法的执行时间。
运行上述代码,得到的输出可能会因运行环境的不同而有所不同。以下是一种可能的输出:
Double.parseDouble() 执行时间:5ms
Double.valueOf() 执行时间:12ms
DecimalFormat 执行时间:38ms
从以上结果可以看出,Double.parseDouble()
方法的性能是最好的,Double.valueOf()
次之,而DecimalFormat
的性能最差。因此,在对性能要求较高的情况下,我们应优先选择Double.parseDouble()
方法进行字符串到Double类型的转换。
6. 总结
本文详细介绍了在Java中将字符串转换为Double类型的几种常用方法,并给出了每种方法的使用示例。我们可以根据实际需求选择适合的方法进行字符串转换。同时,在实际使用中,我们也应该考虑到性能等因素,选择性能较优的方法来进行转换。