输入字符串中的NumberFormatExeption" 2013"

时间:2016-08-18 14:15:55

标签: java numberformatexception

我试图解析csv文件,我需要设置初始句点和最后句号的两个变量,但throws NumberFormatException

String line = null;
int initialPeriod = 0;
int finalPeriod = 0;
double sum = 0;

while ((line = br.readLine()) != null) {
    String[] splitted = line.split(";");

    int period = Integer.parseInt(splitted[0].split("-")[0]);
    if (period < initialPeriod || initialPeriod == 0) {
        initialPeriod = period;
    }
    if (period > finalPeriod || finalPeriod == 0) {
        finalPeriod = period;
    }
}

日期(在splitted[0]中)的格式如下:

年 - 月 - 日小时:分钟

我只需要一年,所以我split splitted[0]使用&#34; - &#34; char然后我将它转换为int但它抛出:

Exception in thread "main" java.lang.NumberFormatException: For input string: "2013­"

(2013年是我档案的第一年)

这是堆栈跟踪:

Exception in thread "main" java.lang.NumberFormatException: For input string: "2013­"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at it.tgi.exercise.parser.MainClassParser.main(MainClassParser.java:21)

4 个答案:

答案 0 :(得分:2)

复制/粘贴给了我答案。

您的文件中没有标准的短划线,但却是一个特殊字符。

实际上,您的字段包含2013\u00AD(因此长度为5)。 \u00AD字符是一种连字符,但不是真的。

在CSV文件中硬键入短划线(-)。

如果您要解析CSV中的日期,则应确保您拥有日期和所需的格式。

为此你应该使用以下内容(我假设你有标准的<year>-<month>-<day>格式):

Java 7及以下

 // Define before the loop, but careful to not share in other threads.
 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

 // The following lines should be in your loop
 String dateField = ... ; // From CSV

 Calendar calendar = new GregorianCalendar();
 Date date= dateFormat.parse(dateField);
 calendar.setTime(date);
 int year = calendar.get(Calendar.YEAR);

Java 8

 // Define before the loop.
 DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;

 // The following lines should be in your loop
 String dateField = ... ; // From CSV

 LocalDate date = LocalDate.parse(dateField, formatter);
 int year = date.getYear();

答案 1 :(得分:0)

尝试以下方法:

while ((line = br.readLine() )!= null) {
    String [] splitted = line.split(";");

    int period = Integer.parseInt(splitted[0].split("-")[0].trim());
    if( period < initialPeriod || initialPeriod == 0)
        initialPeriod = period;
    if(period > finalPeriod || finalPeriod == 0)
        finalPeriod =period;
}

你可能会遇到一些主要的白色标志。

修改

你可以在解析前添加它:System.out.println(splitted [o] .split(&#34; - &#34;)[0] .trim()。length()?给我们结果。是4吗?

结果是5。

答案 2 :(得分:0)

真正的问题是3 后面有一个隐形连字符。虽然你看不到它,但对于运行时来说,它只是一个与其他角色一样的角色。

尝试选择文本输入字符串,然后执行 shift + 向右箭头。您将看到光标位于某个位置。这意味着某处有一个未打印的角色。

您可能希望对您要检索的输入进行清理。没有人向你保证它在第五个位置总是不需要的角色,例如它也可以在第一个位置。因此请谨慎使用substring(0, 4)。如果您的CSV包含更多&#34; false&#34;连字符而不是正常连字符,您可能希望将其包含在拆分模式中:

int yearStr = splitted[0].split("[-\u00AD]")[0];
Integer.parseInt(yearStr);

答案 3 :(得分:0)

问题是一个空白,因为我尝试使用.length,它说2013年有5个字符。 所以我使用.substring(0,4),现在它工作了!