线程“主”java.lang.IllegalArgumentException 中的异常:无法将给定对象格式化为数字

Posted

技术标签:

【中文标题】线程“主”java.lang.IllegalArgumentException 中的异常:无法将给定对象格式化为数字【英文标题】:Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object as a Number 【发布时间】:2021-02-02 00:32:37 【问题描述】:

我需要显示 2 个小数点,但我不知道该怎么做。

线程“main”java.lang.IllegalArgumentException 中的异常:无法将给定对象格式化为数字

import java.text.DecimalFormat;
import java.util.Scanner;
public class ShoppingOrders 
    public static void main(String[] args) 
        double itemPrice, shippingFeeRate, shippingFee,totalCost;
        String nameItem;
        Scanner myScanner= new Scanner (System.in);
        DecimalFormat df = new DecimalFormat("#.00");
        
        nameItem = myScanner.nextLine();
        itemPrice = myScanner.nextDouble();
        shippingFeeRate = myScanner.nextDouble();
        
        shippingFee =shippingFeeRate*itemPrice;
        totalCost = shippingFee+itemPrice;
        
        System.out.println ("Costs for "+nameItem);
        System.out.println (df.format("Item Price: $" +itemPrice));
        System.out.println (df.format("Shipping Fee: $"+ shippingFee));
        System.out.println (df.format("Total Cost: $"+totalCost));
    

【问题讨论】:

【参考方案1】:

您错误地使用了DecimalFormat.format(...)。您不会将其传递给String。您将一个表示数字的对象传递给它。 (或将被装箱为表示数字的对象的原始数字类型。)

例如:

df.format(itemPrice)    // itemPrice will be boxed to a Double

因此,如果您想在输出中包含一条消息,您可以这样做:

System.out.println("Item Price: $" + df.format(itemPrice));

或者,您可以使用String.format(...) 并在格式说明符中指定小数点后的位数。

【讨论】:

【参考方案2】:

DecimalFormat.format(...) 用于格式化数字。在您的情况下,您向双精度数添加了一个字符串,这会将其转换为 String,而 DecimalFormat.format(...) 不支持。相反,使用:

import java.text.DecimalFormat;
import java.util.Scanner;
public class Main
public static void main(String[] args) 
    double itemPrice, shippingFeeRate, shippingFee,totalCost;
    String nameItem;
    Scanner myScanner= new Scanner (System.in);
    DecimalFormat df = new DecimalFormat("#.00");
    
    nameItem = myScanner.nextLine();
    itemPrice = myScanner.nextDouble();
    shippingFeeRate = myScanner.nextDouble();
    
    shippingFee =shippingFeeRate*itemPrice;
    totalCost = shippingFee+itemPrice;
    
    System.out.println ("Costs for "+nameItem);
    System.out.println ("Item Price: $" +df.format(itemPrice));
    System.out.println ("Shipping Fee: $"+ df.format(shippingFee));
    System.out.println ("Total Cost: $"+df.format(totalCost));


【讨论】:

以上是关于线程“主”java.lang.IllegalArgumentException 中的异常:无法将给定对象格式化为数字的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 的 YML 文件中创建条件属性?

主线程怎么给子线程发送消息

主线程啥都没做,就会等待子线程结束。这是为啥?

Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

子线程怎么不阻塞主线程

QT中UI主窗口如何与子线程相互传递参数