【问题标题】:NumberFormatException when parsin JSON String to Java Double将 JSON 字符串解析为 Java Double 时出现 NumberFormatException
【发布时间】:2018-10-03 10:28:34
【问题描述】:

我正在研究货币转换器并尝试将货币从 JSON 字符串解析为加倍。正如我所探索的,它的 JSON 代码中的双引号问题,但我从银行 API 获得了这个 JSON,它无法更改。 我尝试使用另一个旧问题的解决方案,但它不起作用(double vrijednostOne = Double.parseDouble(arr.getJSONObject(indexOne).getString("Srednji za devize"));) 是否有任何解决方案可以用双引号将 JSON 解析为双引号?

btnPreracunaj.addActionListener(evtRacunaj -> {
 //JSON Array - adds String input from StringBuilder
 try {
  arr = new JSONArray(response.toString());

  int indexOne = comboOne.getSelectedIndex();
  int indexTwo = comboTwo.getSelectedIndex();

  String valutaOne = arr.getJSONObject(indexOne).getString("Valuta");
  double vrijednostOne = Double.parseDouble(arr.getJSONObject(indexOne).getString("Srednji za devize"));
  String valutaTwo = arr.getJSONObject(indexTwo).getString("Valuta");
  double vrijednostTwo = Double.parseDouble(arr.getJSONObject(indexTwo).getString("Srednji za devize"));

  System.out.println(valutaOne);
  System.out.println(vrijednostOne);
  System.out.println(valutaTwo);
  System.out.println(vrijednostTwo);
 } catch (JSONException e1) {
  e1.printStackTrace();
 }
});

有来自 API 的 JSON:

[
  {
    "Broj tečajnice": "190",
    "Datum primjene": "03.10.2018",
    "Država": "Australija",
    "Šifra valute": "036",
    "Valuta": "AUD",
    "Jedinica": 1,
    "Kupovni za devize": "4,612753",
    "Srednji za devize": "4,626633",
    "Prodajni za devize": "4,640513"
  }
]

这是个例外:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "4,626633"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at Converter.lambda$0(Converter.java:136)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
...

【问题讨论】:

  • 克罗地亚(以及许多其他欧洲国家)使用小数点逗号,而英语(因此 Java 的 parseDouble)使用小数点。请咨询Best way to parseDouble with comma as decimal separator? 了解如何处理。
  • 不是一个好主意,但您可以用点替换逗号。只需检索字符串值,调用 stringValue.replace(",", ".") 然后解析为 double
  • value.replace(",",".") 工作正常!

标签: java json


【解决方案1】:

您可以在下面的链接中查看答案。它使用语言环境来转换具有 ',' 而不是 '.' 的字符串。成双。解析错误是因为解析字符串以双重期望货币的小数点。

Converting different countrys currency to double using java

【讨论】:

    【解决方案2】:

    由于货币价格似乎使用本地格式,您需要在您的区域设置(或者更确切地说是本地银行)使用数字格式化程序

    NumberFormat format = NumberFormat.getInstance(new Locale("hr","HR"));
    double price = format.parse(arr.getJSONObject(indexOne).getString("Srednji za devize"));
    

    根据评论,我使用 Croation 作为语言环境,但查看 here 以获得完整的语言环境列表。

    【讨论】:

      【解决方案3】:

      你可以有一个方法:

      currency = currency.substring(1, currency.length()-1);
      double mainCurrency = Double.ParseDouble(currency);
      

      【讨论】:

      • 它给出一个介于 1 和最后一个字符之间的字符串,然后解析为 double。
      • 但是双引号不是这里的问题,所以你要删除第一个和最后一个数字。
      猜你喜欢
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多