在Java中,将String转换为double主要有以下几种方法,我会按推荐顺序和使用场景进行详细说明。

核心方法:Double.parseDouble()
这是最常用、最直接的方法,它是一个静态方法,专门用于将String转换为基本数据类型double。
语法
static double parseDouble(String s) throws NumberFormatException
特点
- 返回值:基本数据类型
double。 - 异常处理:如果
String不是有效的数字格式(例如包含字母、为空、或为"null"),它会抛出NumberFormatException。 - 性能:对于直接转换,这是性能最好的方法之一。
示例代码
public class StringToDouble {
public static void main(String[] args) {
String str1 = "123.456";
String str2 = "-78.90";
String str3 = "3.1415926";
String str4 = "123"; // 整数字符串
String str5 = " 99.99 "; // 带有空格的字符串
try {
double d1 = Double.parseDouble(str1);
System.out.println("转换 '" + str1 + "' 结果: " + d1);
double d2 = Double.parseDouble(str2);
System.out.println("转换 '" + str2 + "' 结果: " + d2);
double d3 = Double.parseDouble(str3);
System.out.println("转换 '" + str3 + "' 结果: " + d3);
double d4 = Double.parseDouble(str4);
System.out.println("转换 '" + str4 + "' 结果: " + d4);
// Double.parseDouble() 默认可以处理前后带空格的字符串
double d5 = Double.parseDouble(str5);
System.out.println("转换 '" + str5 + "' 结果: " + d5);
} catch (NumberFormatException e) {
System.err.println("转换失败: 字符串不是一个有效的数字格式。");
e.printStackTrace();
}
}
}
输出:
转换 '123.456' 结果: 123.456
转换 '-78.90' 结果: -78.9
转换 '3.1415926' 结果: 3.1415926
转换 '123' 结果: 123.0
转换 ' 99.99 ' 结果: 99.99
备选方法:Double.valueOf()
这个方法也用于将String转换为double,但它返回的是一个Double对象(即包装类型),而不是基本类型double。
语法
static Double valueOf(String s) throws NumberFormatException
特点
- 返回值:
Double对象。 - 异常处理:同样会抛出
NumberFormatException。 - 使用场景:当你需要一个
Double对象而不是基本类型double时使用(在泛型集合中,如List<Double>)。
示例代码
public class StringToDoubleObject {
public static void main(String[] args) {
String str = "123.456";
// valueOf() 返回一个 Double 对象
Double doubleObject = Double.valueOf(str);
// 如果需要基本类型,可以自动拆箱 (unboxing)
double primitiveDouble = doubleObject;
System.out.println("Double 对象: " + doubleObject);
System.out.println("基本 double 类型: " + primitiveDouble);
}
}
输出:

Double 对象: 123.456
基本 double 类型: 123.456
国际化处理:NumberFormat
如果你的应用程序需要处理不同地区(Locale)的数字格式(欧洲一些国家使用逗号作为小数点),Double.parseDouble() 和 Double.valueOf() 就会失败,这时,你应该使用 java.text.NumberFormat。
特点
- 灵活性:可以解析不同语言环境的数字格式。
- 复杂性:需要创建
NumberFormat实例并进行配置。 - 异常处理:解析失败会抛出
ParseException。
示例代码
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class StringToDoubleLocale {
public static void main(String[] args) {
// 美国格式,使用点作为小数点
String usFormatString = "1,234.56";
// 德国格式,使用逗号作为小数点,并作为千位分隔符
String germanFormatString = "1.234,56";
// 1. 解析美国格式的字符串
NumberFormat usFormat = NumberFormat.getInstance(Locale.US);
try {
double usValue = usFormat.parse(usFormatString).doubleValue();
System.out.println("解析美国格式 '" + usFormatString + "' 结果: " + usValue);
} catch (ParseException e) {
System.err.println("解析美国格式失败。");
}
// 2. 解析德国格式的字符串
NumberFormat germanFormat = NumberFormat.getInstance(Locale.GERMANY);
try {
double germanValue = germanFormat.parse(germanFormatString).doubleValue();
System.out.println("解析德国格式 '" + germanFormatString + "' 结果: " + germanValue);
} catch (ParseException e) {
System.err.println("解析德国格式失败。");
}
}
}
输出:
解析美国格式 '1,234.56' 结果: 1234.56
解析德国格式 '1.234,56' 结果: 1234.56
总结与最佳实践
| 方法 | 返回类型 | 异常 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|---|
Double.parseDouble() |
double (基本类型) |
NumberFormatException |
简单、快速、直接 | 无法处理不同地区的数字格式 | 绝大多数情况下的首选,当字符串格式固定(如点号作为小数点)时。 |
Double.valueOf() |
Double (对象) |
NumberFormatException |
返回对象,可用于泛型 | 需要额外的拆箱步骤,性能略低于parseDouble |
当你需要一个Double对象时,例如在集合或需要处理null值时。 |
NumberFormat |
double (基本类型) |
ParseException |
国际化能力强,能处理不同地区格式 | 代码复杂,性能较低 | 需要解析来自不同国家或地区的用户输入时。 |
重要注意事项
-
处理异常:永远不要假设
String可以成功转换。必须使用try-catch块来捕获NumberFormatException,否则如果格式错误,程序会崩溃。// 错误示范! String badStr = "hello"; double d = Double.parseDouble(badStr); // 程序会在这里抛出异常并终止
-
处理空值:如果
String变量可能为null,直接调用parseDouble(null)会抛出NullPointerException,你需要先进行检查。
(图片来源网络,侵删)String nullableStr = null; if (nullableStr != null) { try { double d = Double.parseDouble(nullableStr); // ... } catch (NumberFormatException e) { // ... } } else { System.out.println("输入字符串为null,无法转换。"); } -
去除空格:虽然
parseDouble能处理前后空格,但为了代码的健壮性,最好在转换前主动调用String.trim()来去除多余的空格。String str = " 123.45 "; double d = Double.parseDouble(str.trim()); // 更清晰,更安全
