将JSON字符串转换为Java Double时出现NumberFormatException

将JSON字符串转换为Java Double时出现NumberFormatException,java,json,Java,Json,我正在开发货币转换器,并尝试将货币从JSON字符串解析为双精度。正如我所探讨的,它的问题是JSON代码中的双引号,但我从banks API获得了这个JSON,它无法更改。 我试图使用另一个老问题的解决方案,但没有成功(double vrijednostOne=double.parseDouble(arr.getJSONObject(indexOne.getString(“Srednji za devize”);) 有什么解决方案可以将带双引号的JSON解析为双引号 btnPreracunaj.a

我正在开发货币转换器,并尝试将货币从JSON字符串解析为双精度。正如我所探讨的,它的问题是JSON代码中的双引号,但我从banks 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)
...

您可以使用以下方法:

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

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


根据一条评论,我使用克罗地亚语作为语言环境,但要查找语言环境的完整列表。

你可以在下面的链接中找到答案。它使用locale将包含“,”而不是“.”的字符串转换为double。分析错误是因为分析字符串时需要使用货币双精度小数点


克罗地亚(以及许多其他欧洲国家)使用十进制逗号,而英语(因此Java的
parseDouble
)使用小数点。咨询一下如何处理这个问题。这不是个好主意,但你可以用点来代替逗号。只需检索字符串值,调用stringValue.replace(“,”,“”),然后解析为doublevalue.replace(“,”,”)就可以了!它给出一个介于1和最后一个字符之间的字符串,然后解析为双引号。但是双引号不是问题所在,所以您要删除第一个和最后一个数字。
NumberFormat format = NumberFormat.getInstance(new Locale("hr","HR"));
double price = format.parse(arr.getJSONObject(indexOne).getString("Srednji za devize"));