Number Format在java中异常,但格式为真


List<Person> list=new ArrayList<Person>();
public List<Person> readFile(){
File file =new File("dosya.txt");
try {
FileReader fileReader=new FileReader(file);
BufferedReader reader=new BufferedReader(fileReader);
while(reader.readLine()!=null){
String personData= reader.readLine();
System.out.println(personData);
Person person=new Person();
person.setName(personData.substring(1,personData.indexOf("#")));
String sayı=personData.substring(personData.indexOf("#")+1,personData.indexOf("#",personData.indexOf("#")+1));
person.setMoney(Double.valueOf(sayı));
personData=personData.substring(personData.indexOf("#")+1);
System.out.println(personData);
person.setRate(Double.valueOf(personData.substring(0,3)));
personData=personData.substring(personData.indexOf("#")+1);
System.out.println(personData);
person.setNumber(Short.valueOf(personData));
list.add(person);
}
} catch (Exception e) {
e.printStackTrace();
}

这是我的代码,它分隔了"fsyxaimvct wdyyttuye #1528640,88#0,7#9"这种类型的数据,它给出了像这样的mi错误

java.lang.NumberFormatException: For input string: "2273370,68"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.base/java.lang.Double.parseDouble(Double.java:549)
at java.base/java.lang.Double.valueOf(Double.java:512)
at FileProcess.readFile(FileProcess.java:19)
at Main.main(Main.java:7)

为什么不能把2273370,68变成double

Double.valueOf()不'do' locale -它只解析使用.作为小数分隔符的数字。您的输入字符串包含一个逗号,这意味着它将失败。

但是,这段代码基本上是无用的。你不能用双精度来计算货币——双精度是不精确的,会无声地四舍五入。当使用货币时,这不是你想要的。

最简单的解决方案是存储货币的"原子单位"。对于美元,存储美元美分。对于比特币,存储中本聪。买日元,存日元。英镑要存便士。等等......在long中,或者如果你必须,BigInteger

或者,使用库(joda-currency是一个很好的库)。你经常会听到使用BigDecimal的建议,但这通常是一个坏主意(它有各种各样的复杂问题;例如,除非你真的知道你在做什么,否则你根本不能对BigDecimals进行除法(而且为它们编写代码很复杂)。

解析包含欧元金额的字符串,例如"-1234,58",可以使用以下命令解析为long-123458:

Pattern p = Pattern.compile("^(-?)(\s*\d*)(?:,(\d{2}))?$");
var m = p.matcher("2273370,68");
long amount;
if (m.matches()) {
amount =
(m.group(1).equals("-") ? -1L : 1L) * (
100 * (m.group(2).isEmpty() ? 0 : Long.parseLong(m.group(2))) +
(m.group(3) != null ? Long.parseLong(m.group(3)) : 0L));
} else throw new NumberFormatException();

任何使用Double.parseDouble的尝试都会让你陷入四舍五入的麻烦,你会随机失去或获得一分钱。像这样运行银行,你可能会遇到一点麻烦:)

最新更新