Java 在另一台计算机上执行应用程序时出现BigDecimal NumberFormatException

Java 在另一台计算机上执行应用程序时出现BigDecimal NumberFormatException,java,bigdecimal,numberformatexception,Java,Bigdecimal,Numberformatexception,大家好,我在执行这段代码时出错了 它在我的电脑上运行得很好,但当我把应用程序发送给我的朋友尝试时,它导致了数字格式异常,代码有问题吗?如果是这样,为什么它在我的计算机中工作 ps:我在另一台计算机上试用了这个应用程序,效果很好 double total = 0; //here there is a for loop changing the total value //but in this case (when the application starts) the loop conditi

大家好,我在执行这段代码时出错了 它在我的电脑上运行得很好,但当我把应用程序发送给我的朋友尝试时,它导致了数字格式异常,代码有问题吗?如果是这样,为什么它在我的计算机中工作 ps:我在另一台计算机上试用了这个应用程序,效果很好

double total = 0;
//here there is a for loop changing the total value 
//but in this case (when the application starts) the loop condition will be false
//so the total will stay 0 
String totalS = String.format("%.2f", total);
if (totalS.endsWith(".00")) {
    totalS = totalS.substring(0,totalS.length()-3);
}
lblDa.setText(new BigDecimal(totalS).toPlainString() +" DA");
编辑:这是错误消息

java.lang.NumberFormatException: Character , is neither a decimal digit number, decimal point, nor "e" notation exponential mark.
        at java.base/java.math.BigDecimal.<init>(BigDecimal.java:519)
        at java.base/java.math.BigDecimal.<init>(BigDecimal.java:402)
        at java.base/java.math.BigDecimal.<init>(BigDecimal.java:835)
        at invpack.MainFrame.updateTotal(MainFrame.java:3052)
        at invpack.MainFrame.initialize(MainFrame.java:557)
        at invpack.MainFrame.<init>(MainFrame.java:185)
        at invpack.MainFrame$1.run(MainFrame.java:171)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
java.lang.NumberFormatException:字符,既不是十进制数字、小数点,也不是“e”符号指数符号。
位于java.base/java.math.BigDecimal.(BigDecimal.java:519)
位于java.base/java.math.BigDecimal.(BigDecimal.java:402)
位于java.base/java.math.BigDecimal.(BigDecimal.java:835)
位于invpack.MainFrame.updateTotal(MainFrame.java:3052)
在invpack.MainFrame.initialize(MainFrame.java:557)中
位于invpack.MainFrame(MainFrame.java:185)
在invpack.MainFrame$1.run(MainFrame.java:171)
在java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)中
位于java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
位于java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
位于java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
位于java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
位于java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
位于java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
位于java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
位于java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
位于java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
位于java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
位于java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
位于java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

您正在使用的
String.format
方法从用户首选项中查找有关数字格式的详细信息:它可能使用“,”而不是“.”作为十进制分隔符,甚至可能使用0-9以外的数字。程序的其余部分假定生成的字符串使用ASCII数字,十进制分隔符使用“.”

当需要
String.format
以特定样式生成数字时,请传入固定的区域设置参数:

String totalS = String.format(Locale.ROOT, "%.2f", total);
另一方面,看起来所有这些代码都只是为了不显示尾随的零。有一种更直接的方法来实现这一点:使用数字格式,使尾随零成为可选的

DecimalFormat formatter = new DecimalFormat("0.##");
lblDa.setText(formatter.format(total) +" DA");

字符串s=新的十进制格式(“0.######”)格式(Double.parseDouble(value))


它将从任何双精度值中删除任何前导零

请提供异常错误消息(理想情况下是完整的stacktrace,但在本例中这可能不太重要)。此外:在缺乏更详细信息的情况下,我的猜测是区域设置差异是问题的原因。例如,不同计算机的语言没有设置为相同的值。您的朋友是否使用逗号而不是点作为小数分隔符?@JoachimSauer我发布了错误消息,您认为如何?地区差异?我怎样才能解决这个问题that@BenjaminD你的意思是当他打字时,或者他的计算机是否用逗号或点表示小数点?我正在使用bigdecimal将双精度中的指数转换为纯文本,使用String.format(Locale.ROOT,“%.2f”,total);它仍然适用于我,但我正在等待我的朋友尝试它。
DecimalFormat
number formatting类也可以这样做,同时让您可以更好地控制格式,例如将
123
格式化为
123
而不是
123.00
。哦,我不知道,谢谢,我会查看它的