【问题标题】:How to prevent Java from converting barcode to scientific notation如何防止Java将条形码转换为科学计数法
【发布时间】:2019-06-22 11:31:38
【问题描述】:

我正在尝试从 csv 文件中读取条形码。奇怪的是,当我在 IntelliJ 中打开文件时,它会完整显示条形码。当我尝试读取 csv 文件时,条形码被转换为科学计数法的数字。

我在网上找到的最常见的解决方案是使用 Double.parseDouble(string) 将 String 转换为 Double。但这会引发异常:

java.lang.NumberFormatException: For input string: "5,40014E+12"

实际方法:

public String getField(String barcode) {
    String field = null;
    try {
        String line;
        br = new BufferedReader(new FileReader(csvFile));
        br.readLine();
        while ((line = br.readLine()) != null) {
            String[] barcodeData = line.split(delimiter);
            System.out.println(Double.parseDouble(barcodeData[2]));
            if (barcodeData[2].equals(barcode)) {
                field = barcodeData[67];
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return field;
}

此方法用于有硬编码预期结果的测试。但是在这种情况下,field 总是返回 null,因为 if 子句在这里永远不会返回 true。实际异常在 System.out.println 中引发,我在其中检查如何从 CSV 读取数字。

条形码应为:5400141331875

从csv文件中实际读取的内容:5,40014E+12

如何阻止 Java 将条形码转换为科学计数法?

编辑

我找到了一个“解决方案”。如果我不打开实际的 CSV 文件,数字不会转换为科学计数法。对我来说,这是一个实际的解决方案,我希望将来有与我相同问题的人找到实际答案,为什么我的条形码无法从 String 转换为 Double/Long。谢谢大家的帮助。

【问题讨论】:

  • 你确定...E+12的值不是因为CSV
  • 写入CSV时必须使用Long
  • 条码数据实际上是一个字符串,而不是一个数字。您应该将其视为字符串。如果你得到科学记数法,问题就发生在你的程序参与之前。
  • 用文本编辑器打开 CSV 的内容是什么?

标签: java csv bufferedreader filereader


【解决方案1】:

您是否尝试过将其解析为 Long 而不是 Double ? 请看下面,我得到了预期的值:

String s = "5400141331875";
System.out.println(Double.valueOf(s).longValue());

打印 5400141331875

【讨论】:

  • 这不是答案。这是一条评论
  • @Gauravsa 我有点快..答案更新了提案
  • 需要转换的字符串是“5,40014E+12”,因为这是从CSV文件中读取的,即使在CSV中内容是“5400141331875”。解析为 Long 会引发同样的异常。
  • @Audiosleef 不,它没有。尝试用System.out.println(Double.valueOf(barcodeData[2]).longValue()); 替换你的System.out.println(Double.parseDouble(barcodeData[2])); 行,看看你会得到什么
  • @funkyjelly 抛出:java.lang.NumberFormatException:对于输入字符串:“5,40014E+12”
【解决方案2】:

您可以尝试以下方法:

  BigDecimal bd = new BigDecimal("5400141331875");

  System.out.println(bd.longValue());  // this prints 5400141331875

【讨论】:

  • OP 希望避免转换为科学记数法
  • 抛出:java.lang.NumberFormatException: Character ,既不是十进制数,也不是小数点,也不是“e”符号指数标记。
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2019-08-11
  • 2019-03-24
  • 2012-06-22
  • 2019-07-09
  • 2011-11-19
相关资源
最近更新 更多