使用 Double.parseDouble() (最常用、推荐)
这是 Java 标准库提供的方法,也是将字符串转换为 double 的首选方式,它是一个静态方法,直接在 Double 类上调用。
基本用法
public class StringToDoubleExample {
public static void main(String[] args) {
String str1 = "123.45";
String str2 = "-78.90";
String str3 = "100"; // 整数字符串也可以
// 使用 Double.parseDouble() 进行转换
double d1 = Double.parseDouble(str1);
double d2 = Double.parseDouble(str2);
double d3 = Double.parseDouble(str3);
System.out.println(d1); // 输出: 123.45
System.out.println(d2); // 输出: -78.9
System.out.println(d3); // 输出: 100.0
// 也可以直接用在表达式中
double result = d1 + d2;
System.out.println("Result: " + result); // 输出: Result: -44.55
}
}
处理异常
如果字符串的格式不正确(包含非数字字符、为空或为 null),Double.parseDouble() 会抛出 NumberFormatException 异常,在实际开发中,你必须使用 try-catch 块来处理这种潜在的错误。
public class StringToDoubleWithErrorHandling {
public static void main(String[] args) {
String[] numberStrings = {"123.45", "abc", null, " 123.45 ", "1,000.50"};
for (String str : numberStrings) {
try {
// trim() 可以去除字符串前后的空格,这是一个好习惯
if (str != null) {
double number = Double.parseDouble(str.trim());
System.out.println("转换成功: '" + str + "' -> " + number);
} else {
System.out.println("输入为 null,无法转换。");
}
} catch (NumberFormatException e) {
// 捕获格式异常,程序不会因此中断
System.out.println("转换失败: '" + str + "' 不是有效的数字格式。");
}
}
}
}
输出:

转换成功: '123.45' -> 123.45
转换失败: 'abc' 不是有效的数字格式。
输入为 null,无法转换。
转换成功: ' 123.45 ' -> 123.45
转换失败: '1,000.50' 不是有效的数字格式。
注意:
"1,000.50"会失败,因为parseDouble不接受千位分隔符(逗号),如果需要处理这种格式,需要先移除逗号。
使用 Double.valueOf()
Double 类还提供了 valueOf() 方法,它也可以将字符串转换为 double,从功能上看,它与 parseDouble() 非常相似。
基本用法和区别
public class ValueOfExample {
public static void main(String[] args) {
String str = "123.45";
// 使用 Double.valueOf()
Double doubleObject = Double.valueOf(str); // 返回一个 Double 对象 (Wrapper Class)
// 如果需要基本数据类型 double,需要再调用 .doubleValue()
double primitiveDouble = doubleObject.doubleValue();
System.out.println("Double 对象: " + doubleObject);
System.out.println("基本数据类型 double: " + primitiveDouble);
// 与 parseDouble 的直接比较
double d1 = Double.parseDouble(str);
System.out.println("parseDouble 结果: " + d1);
}
}
核心区别:
Double.parseDouble(String s):直接返回一个 基本数据类型double。Double.valueOf(String s):返回一个Double对象(包装类)。
如何选择?

- 如果你需要的是一个
double变量(例如用于数学计算),直接使用parseDouble()更高效,因为它避免了自动拆箱的过程。 - 如果你需要一个
Double对象(当你需要一个可以接受null值的Double变量时,或者在泛型集合中),使用valueOf()。
高级主题和最佳实践
处理不同地区的数字格式
不同地区使用不同的符号表示小数点( 或 ),在欧洲大陆,123,45 表示一百二十三点四五。
Double.parseDouble()始终使用Locale.US的格式(即小数点是 )。"123,45"在它看来是无效的。
如果你需要根据用户的地区设置来解析字符串,应该使用 NumberFormat 类。
import java.text.NumberFormat;
import java.util.Locale;
import java.text.ParseException;
public class LocaleSensitiveParsing {
public static void main(String[] args) throws ParseException {
String usNumber = "1,234.56"; // 美国格式,逗号是千位分隔符
String deNumber = "1.234,56"; // 德国格式,点是千位分隔符,逗号是小数点
// 创建美国和德国的数字格式化器
NumberFormat usFormat = NumberFormat.getInstance(Locale.US);
NumberFormat deFormat = NumberFormat.getInstance(Locale.GERMANY);
// 解析美国数字
double usValue = usFormat.parse(usNumber).doubleValue();
System.out.println("解析美国数字 '" + usNumber + "': " + usValue); // 输出: 1234.56
// 解析德国数字
double deValue = deFormat.parse(deNumber).doubleValue();
System.out.println("解析德国数字 '" + deNumber + "': " + deValue); // 输出: 1234.56
}
}
注意:
NumberFormat.parse()会抛出ParseException,你需要处理它。
使用第三方库 (Apache Commons Lang)
如果你已经在项目中使用了 Apache Commons Lang 库,它的 NumberUtils 提供了非常方便的工具方法。

添加依赖 (Maven):
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version> <!-- 使用最新版本 -->
</dependency>
使用 NumberUtils.createDouble():
这个方法非常“宽容”,它不仅能处理标准格式,还能处理 null 和空字符串。
import org.apache.commons.lang3.math.NumberUtils;
public class ApacheCommonsExample {
public static void main(String[] args) {
String str1 = "123.45";
String str2 = " -78.90 "; // 自动 trim
String str3 = "100";
String str4 = "abc"; // 无效数字
String str5 = ""; // 空字符串
String str6 = null; // null
// createDouble 在转换失败时会返回 null,而不会抛出异常
Double d1 = NumberUtils.createDouble(str1);
Double d2 = NumberUtils.createDouble(str2);
Double d3 = NumberUtils.createDouble(str3);
Double d4 = NumberUtils.createDouble(str4);
Double d5 = NumberUtils.createDouble(str5);
Double d6 = NumberUtils.createDouble(str6);
System.out.println(d1); // 输出: 123.45
System.out.println(d2); // 输出: -78.9
System.out.println(d3); // 输出: 100.0
System.out.println(d4); // 输出: null
System.out.println(d5); // 输出: null
System.out.println(d6); // 输出: null
}
}
优点:
- 代码更简洁,无需
try-catch。 - 自动处理
null和空字符串,返回null,避免了NullPointerException。
缺点:
- 增加了项目对第三方库的依赖。
总结与推荐
| 方法 | 返回类型 | 异常处理 | 主要用途 |
|---|---|---|---|
Double.parseDouble() |
double (基本类型) |
抛出 NumberFormatException |
首选,当你需要一个基本类型的 double 并且需要严格验证输入时。 |
Double.valueOf() |
Double (对象) |
抛出 NumberFormatException |
当你需要一个 Double 对象时。 |
NumberFormat.parse() |
Number (对象) |
抛出 ParseException |
**国际化场景 |
