杰瑞科技汇

Java字符串如何转double?

在 Java 中,将字符串(String)转换为 double 类型主要有以下几种方法,我会为你详细介绍,包括它们的用法、示例、注意事项以及如何处理异常。

Java字符串如何转double?-图1
(图片来源网络,侵删)

使用 Double.parseDouble(String s) - 最常用

这是最直接、最常用的方法,它是一个静态方法,尝试将给定的字符串解析为 double 类型。

语法

public static double parseDouble(String s) throws NumberFormatException;

特点

  • 如果字符串可以成功解析为 double,则返回对应的 double 值。
  • 如果字符串不是有效的 double 格式,会抛出 NumberFormatException 异常。

示例代码

public class StringToDoubleExample {
    public static void main(String[] args) {
        String str1 = "123.456";
        String str2 = "-78.90";
        String str3 = "3.141592653589793";
        String str4 = "1.23e4"; // 科学计数法
        String str5 = "  123.45  "; // 前后有空格
        try {
            double d1 = Double.parseDouble(str1);
            System.out.println("转换结果: " + d1); // 输出: 123.456
            double d2 = Double.parseDouble(str2);
            System.out.println("转换结果: " + d2); // 输出: -78.9
            double d3 = Double.parseDouble(str3);
            System.out.println("转换结果: " + d3); // 输出: 3.141592653589793
            double d4 = Double.parseDouble(str4);
            System.out.println("转换结果: " + d4); // 输出: 12300.0
            double d5 = Double.parseDouble(str5);
            System.out.println("转换结果: " + d5); // 输出: 123.45
            // 以下代码会抛出异常
            String invalidStr = "abc123.45";
            double d6 = Double.parseDouble(invalidStr);
            System.out.println(d6);
        } catch (NumberFormatException e) {
            System.err.println("转换失败: 字符串格式不正确");
            e.printStackTrace();
        }
    }
}

注意事项

  • 字符串必须完全有效:字符串内容必须是一个合法的 double 数值表示,它可以是:
    • 十进制数(如 45, -78.9
    • 科学计数法(如 23e4, 5E-10
    • 包含前导和尾随空格(如 " 123.45 "
  • 无效格式会抛出异常:如果字符串包含非数字字符(如 abc)、空字符串 或 null,都会抛出 NumberFormatException
  • null 处理:如果传入的字符串是 null,同样会抛出 NullPointerException

使用 Double.valueOf(String s)

Double 类的 valueOf 方法也可以将字符串转换为 double,但它返回的是一个 Double 对象(即 double 的包装类型)。

语法

public static Double valueOf(String s) throws NumberFormatException;

特点

  • parseDouble 一样,如果字符串格式无效,会抛出 NumberFormatException
  • 返回的是一个 Double 对象,而不是原始的 double 类型,如果需要 double 类型,需要进行自动拆箱(unboxing)。

示例代码

public class StringToDoubleValueOfExample {
    public static void main(String[] args) {
        String str = "123.456";
        // valueOf 返回 Double 对象
        Double doubleObj = Double.valueOf(str);
        System.out.println("Double 对象: " + doubleObj);
        // 自动拆箱为 double 原始类型
        double d = doubleObj; // 或者 d = Double.valueOf(str);
        System.out.println("double 原始类型: " + d);
        // 直接使用
        double d2 = Double.valueOf(str); // 自动拆箱
        System.out.println("直接转换: " + d2);
    }
}

parseDouble 的区别

方法 返回类型 用途
Double.parseDouble() double (原始类型) 当你明确需要一个 double 值时使用,性能稍好(避免了对象的创建)。
Double.valueOf() Double (对象类型) 当你需要一个 Double 对象时使用,例如在泛型集合(如 List<Double>)中。

使用 new Double(String s) (已过时)

在早期版本的 Java 中,可以通过 Double 的构造函数来创建一个 Double 对象。

语法

public Double(String s) throws NumberFormatException;

特点

  • 已过时 (Deprecated):从 Java 9 开始,这个构造函数被标记为过时,官方文档建议使用 valueOf(String) 方法,因为它可以利用缓存机制提高性能(对于频繁使用的值如 -Infinity, Infinity, NaN 等)。
  • 功能与 valueOf 相同:同样返回一个 Double 对象。

示例代码 (不推荐)

// 过时的用法,不推荐
String str = "123.456";
Double doubleObj = new Double(str); // 已过时
System.out.println(doubleObj);

使用 NumberFormat 类 (处理本地化格式)

如果你的字符串包含特定于本地(Locale)的数字格式(欧洲国家用逗号 作为小数点),Double.parseDouble 可能会失败,这时,可以使用 NumberFormat 类。

Java字符串如何转double?-图2
(图片来源网络,侵删)

特点

  • 可以解析特定于本地化的数字字符串。
  • 需要先创建一个 NumberFormat 实例,并设置正确的本地化环境。

示例代码 (解析欧洲格式的数字)

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class StringToDoubleLocaleExample {
    public static void main(String[] args) {
        // 欧洲格式,逗号作为小数点
        String europeanNumber = "123,45";
        Locale germanLocale = Locale.GERMANY; // 德国使用逗号作为小数点
        try {
            NumberFormat germanFormat = NumberFormat.getInstance(germanLocale);
            Number number = germanFormat.parse(europeanNumber);
            double d = number.doubleValue();
            System.out.println("转换结果: " + d); // 输出: 123.45
        } catch (ParseException e) {
            System.err.println("解析失败: " + e.getMessage());
        }
    }
}

处理异常和 null

在实际开发中,处理无效输入和 null 是非常重要的。

示例:封装一个安全的转换方法

public class SafeConverter {
    /**
     * 将字符串安全地转换为 double,如果转换失败则返回默认值。
     * @param str 要转换的字符串
     * @param defaultValue 转换失败时的默认值
     * @return 转换后的 double 值,或默认值
     */
    public static String toDouble(String str, double defaultValue) {
        if (str == null || str.trim().isEmpty()) {
            return String.valueOf(defaultValue); // 返回默认值的字符串形式
        }
        try {
            return String.valueOf(Double.parseDouble(str.trim()));
        } catch (NumberFormatException e) {
            return String.valueOf(defaultValue);
        }
    }
    public static void main(String[] args) {
        String str1 = "123.45";
        String str2 = "not a number";
        String str3 = null;
        String str4 = "  -99.9  ";
        System.out.println(toDouble(str1, 0.0));  // 输出: 123.45
        System.out.println(toDouble(str2, 0.0));  // 输出: 0.0
        System.out.println(toDouble(str3, -1.0)); // 输出: -1.0
        System.out.println(toDouble(str4, 0.0));  // 输出: -99.9
    }
}

总结与推荐

场景 推荐方法 原因
标准数字字符串 (如 "123.45") Double.parseDouble() 最简单、最直接、性能最好。
需要 Double 对象 (如存入集合) Double.valueOf() 返回对象,符合泛型要求,且性能良好。
本地化数字字符串 (如 "123,45") NumberFormat 能正确处理不同地区的数字格式。
需要处理 null 或异常 try-catch + parseDouble 提供健壮的错误处理机制。
旧代码维护 new Double(String) 不推荐,已过时,应使用 valueOf

最佳实践建议:

  • 除非有特殊需求(如处理本地化格式),否则优先使用 Double.parseDouble()
  • 始终将字符串转换操作放在 try-catch 块中,以优雅地处理可能出现的 NumberFormatException
  • 在转换前,可以先用 str.trim() 去除字符串前后的空格,以避免不必要的异常。
Java字符串如何转double?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇