杰瑞科技汇

Java String转Double怎么转?

使用 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 + "' 不是有效的数字格式。");
            }
        }
    }
}

输出:

Java String转Double怎么转?-图1

转换成功: '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 对象(包装类)

如何选择?

Java String转Double怎么转?-图2

  • 如果你需要的是一个 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 提供了非常方便的工具方法。

Java String转Double怎么转?-图3

添加依赖 (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 **国际化场景

分享:
扫描分享到社交APP
上一篇
下一篇