java.lang.NumberFormatException:对于输入字符串:“;2019-11-27”;
在我的应用程序中,我从API服务器获取的日期为String值,我想将其解析为int,但出现以下错误:java.lang.NumberFormatException:对于输入字符串:“;2019-11-27”;,java,android,json,date,date-parsing,Java,Android,Json,Date,Date Parsing,在我的应用程序中,我从API服务器获取的日期为String值,我想将其解析为int,但出现以下错误: 原因:java.lang.NumberFormatException:对于输入字符串:“2019-11-27” 位于java.lang.Integer.parseInt(Integer.java:521) 位于java.lang.Integer.parseInt(Integer.java:556) 我正在尝试解析为int。我想把它传递给BarEntry类构造函数,它只接受int值或float
原因:java.lang.NumberFormatException:对于输入字符串:“2019-11-27”
位于java.lang.Integer.parseInt(Integer.java:521)
位于java.lang.Integer.parseInt(Integer.java:556)
我正在尝试解析为int
。我想把它传递给BarEntry
类构造函数,它只接受int值或float new BarEntry(int或float值,float)。我需要它来显示图表
我的活动
试试看{
Response=client.newCall(request.execute();
Log.d(“Response”,Response.toString());
JSONObject对象=新的JSONObject(Objects.requireNonNull(response.body()).string());
JSONObject rates=object.getJSONObject(“rates”);
迭代器Iterator=rates.keys();
while(iterator.hasNext()){
String keyDate=iterator.next();//我要解析为int值的日期
字符串cad=rates.getJSONObject(keyDate.getString(“cad”);
@SuppressLint(“DefaultLocale”)字符串值=String.format(“%.4s”,cad);
float value1=float.parseFloat(值);
int date=Integer.parseInt(keyDate);
Log.d(“标记”,日期+”);
//Log.d(“标记”,值1+”);
//添加(新的BarEntry(keyDate,value1));
}
}捕获(IOException | JSONException e){
e、 printStackTrace();
Log.d(“ChartActivity”,例如toString());
}
LocalDate和ThreeTenABP
此代码段输出:
18227
文件说明:
纪元日计数是一个简单的日递增计数,其中日为0
is 1970-01-01(ISO)
所以我的建议是,这个数字可以输入到您的BarEntry
构造函数中
toEpochDay()
返回一个long
。如果构造函数不接受long
,请转换为int
。在上面的代码中,我做了一个简单的转换。风险在于,如果在遥远的将来或遥远的过去发生int
溢出,我们将得到一个非常错误的结果。我更喜欢进行范围检查,以避免:
long epochDayLong = date.toEpochDay();
if (epochDayLong < Integer.MIN_VALUE || epochDayLong > Integer.MAX_VALUE) {
throw new IllegalStateException("Date " + date + " is out of range");
}
int epochDay = (int) epochDayLong;
2019-11-27
如果您需要以相反的方式转换,只要您知道如何:
LocalDate convertedBack = LocalDate.ofEpochDay(epochDay);
结果是具有相同值的LocalDate
问:java.time不需要Android API级别26吗?
time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
- 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
导入日期和时间类org.threeten.bp
- 解释如何使用java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
“2019-11-27”
,它不能解析为int。你想用它做什么?@khelwood,因为我想把它传递给BarEntry类构造函数,它只接受int值或float新的BarEntry(int或float值,float);我需要它来显示图表我建议Math.toIntExact(LocalDate.parse(“2019-11-27”).toEpochDay())
。这个例子产生了18227,一个int
,你可以轻松地将它传递给BarEntry
构造函数。哦,我不知道这个,抱歉。您可以简单地强制转换:(int)LocalDate.parse(“2019-11-27”).toEpochDay()
。和/或编码一个范围在施法前检查自己。您也可以将其转换为float
,这样就不需要进行范围检查。您获得的是纪元日,您不会将日期传递给构造函数,因为如果我的内存正常,则需要几毫秒的时间。谢谢您的帮助,我接受了您的答案,我的帐户中还有一个问题,您能帮我解决吗?我将把链接粘贴到这里:【谢谢,@MohammedQadah。恐怕我不能帮你做另一个。无论如何,我会在有时间的时候仔细看看。好的,非常感谢你,我会等的
System.out.println(date);
LocalDate convertedBack = LocalDate.ofEpochDay(epochDay);