杰瑞科技汇

Java String转Double如何实现?

使用 Double.parseDouble() (最常用)

这是最直接、最常用的方法,它是一个静态方法,专门用于将 String 转换为 double 原始类型。

Java String转Double如何实现?-图1
(图片来源网络,侵删)

语法

double doubleValue = Double.parseDouble(String str);

示例代码

public class StringToDoubleExample {
    public static void main(String[] args) {
        String str1 = "123.45";
        String str2 = "-78.90";
        String str3 = "3.1415926";
        // 转换并打印
        double d1 = Double.parseDouble(str1);
        double d2 = Double.parseDouble(str2);
        double d3 = Double.parseDouble(str3);
        System.out.println("字符串 '" + str1 + "' 转换为 double: " + d1);
        System.out.println("字符串 '" + str2 + "' 转换为 double: " + d2);
        System.out.println("字符串 '" + str3 + "' 转换为 double: " + d3);
        // 计算示例
        double sum = d1 + d2;
        System.out.println(str1 + " + " + str2 + " = " + sum);
    }
}

输出:

字符串 '123.45' 转换为 double: 123.45
字符串 '-78.9' 转换为 double: -78.9
字符串 '3.1415926' 转换为 double: 3.1415926
123.45 + -78.9 = 44.55

使用 Double.valueOf() (返回包装类)

这个方法也可以将 String 转换为 double,但它返回的是 Double 对象(即 double 的包装类),而不是原始的 double 类型,如果你需要一个对象(在泛型集合 List<Double> 中使用),这个方法很有用。

语法

Double doubleObject = Double.valueOf(String str);

示例代码

public class StringToDoubleWrapperExample {
    public static void main(String[] args) {
        String str = "99.99";
        // valueOf() 返回一个 Double 对象
        Double doubleObject = Double.valueOf(str);
        // 如果需要原始类型,可以自动拆箱
        double primitiveDouble = doubleObject;
        System.out.println("字符串 '" + str + "' 转换为 Double 对象: " + doubleObject);
        System.out.println("Double 对象的值: " + primitiveDouble);
        System.out.println("Double 对象的类型: " + doubleObject.getClass().getName());
    }
}

输出:

字符串 '99.99' 转换为 Double 对象: 99.99
Double 对象的值: 99.99
Double 对象的类型: java.lang.Double

重要:异常处理 (NumberFormatException)

String 的格式不正确,上述两种方法都会抛出 NumberFormatException 异常。在生产环境中,你必须使用 try-catch 块来处理这种可能性。

Java String转Double如何实现?-图2
(图片来源网络,侵删)

什么情况下会抛出异常?

  • 字符串不是有效的数字格式("abc", "12a34")。
  • 字符串为 null 或空 。
  • 字符串表示的数字超出 double 的范围(一个非常非常大的数)。

示例:使用 try-catch 进行安全转换

public class SafeStringToDoubleConversion {
    public static void main(String[] args) {
        String[] inputs = {
            "123.45",
            "-67.89",
            "not a number",
            "123,45", // 在某些地区是有效的,但在 Java 默认中不是
            "1.7976931348623157E308", // 超出 double 范围
            null,
            ""
        };
        for (String input : inputs) {
            try {
                // 检查 null 或空字符串,避免 NullPointerException
                if (input == null || input.trim().isEmpty()) {
                    System.out.println("输入 '" + input + "' 是无效的(null 或空字符串)。");
                    continue;
                }
                double value = Double.parseDouble(input);
                System.out.println("成功转换 '" + input + "' 为: " + value);
            } catch (NumberFormatException e) {
                System.out.println("无法转换 '" + input + "',原因:格式不正确。");
            }
        }
    }
}

输出:

成功转换 '123.45' 为: 123.45
成功转换 '-67.89' 为: -67.89
无法转换 'not a number',原因:格式不正确。
无法转换 '123,45',原因:格式不正确。
无法转换 '1.7976931348623157E308',原因:格式不正确。
输入 'null' 是无效的(null 或空字符串)。
输入 '' 是无效的(null 或空字符串)。

处理不同地区的数字格式

在某些国家/地区,小数点是用逗号 () 表示的,而不是点 (),直接使用 Double.parseDouble() 会失败。

解决方案是使用 java.text.NumberFormatjava.util.Locale

示例:解析欧洲格式的数字 (使用逗号)

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class LocaleSensitiveParsing {
    public static void main(String[] args) {
        String germanNumber = "123,45"; // 德语格式,逗号是小数点
        String usNumber = "123.45";    // 美国格式,点是小数点
        // 1. 解析德语格式的数字
        NumberFormat germanFormat = NumberFormat.getInstance(Locale.GERMAN);
        try {
            double germanValue = germanFormat.parse(germanNumber).doubleValue();
            System.out.println("德语数字 '" + germanNumber + "' 转换为: " + germanValue);
        } catch (ParseException e) {
            System.err.println("解析德语数字失败: " + e.getMessage());
        }
        // 2. 尝试用默认格式解析德语数字(会失败)
        try {
            // 这会抛出 NumberFormatException,因为默认 locale 可能不是德国
            double value = Double.parseDouble(germanNumber);
            System.out.println("直接解析德语数字 '" + germanNumber + "' 为: " + value);
        } catch (NumberFormatException e) {
            System.out.println("直接解析德语数字 '" + germanNumber + "' 失败,符合预期。");
        }
        // 3. 解析美国格式的数字
        NumberFormat usFormat = NumberFormat.getInstance(Locale.US);
        try {
            double usValue = usFormat.parse(usNumber).doubleValue();
            System.out.println("美国数字 '" + usNumber + "' 转换为: " + usValue);
        } catch (ParseException e) {
            System.err.println("解析美国数字失败: " + e.getMessage());
        }
    }
}

输出 (在默认 locale 为 US 的系统上):

Java String转Double如何实现?-图3
(图片来源网络,侵删)
德语数字 '123,45' 转换为: 123.45
直接解析德语数字 '123,45' 失败,符合预期。
美国数字 '123.45' 转换为: 123.45

总结与最佳实践

方法 返回类型 优点 缺点 适用场景
Double.parseDouble() double (原始类型) 最常用、最直接、性能稍好 抛出 NumberFormatException 当你确定字符串格式正确,或者已经准备好处理异常时,绝大多数情况下使用此方法。
Double.valueOf() Double (包装类) 返回一个对象,可用于泛型 需要额外的拆箱步骤才能得到原始类型 当你需要一个 Double 对象而不是 double 原始类型时。
NumberFormat double (通过 parse().doubleValue()) 非常灵活,能处理不同地区的数字格式(如 vs ) 代码更复杂,性能较差 当你需要处理来自不同国家或地区的用户输入时。

核心建议:

  1. 首选 Double.parseDouble():对于大多数内部逻辑或数据转换,这是最简单、最有效的方法。
  2. 总是进行异常处理:使用 try-catch (NumberFormatException) 来防止因无效输入导致程序崩溃。
  3. 处理 null 和空字符串:在调用解析方法前,检查字符串是否为 null 或空,这是一个良好的编程习惯。
  4. 考虑本地化:如果你的应用需要国际化,并且用户可能输入
分享:
扫描分享到社交APP
上一篇
下一篇