10

我正在从 CSV 文件中读取数据。其中一个字段包含值1,167.40。读取该字段的代码如下:

String csvFilename = "TEST_FILE.csv";
CSVReader csvReader = new CSVReader(new FileReader(csvFilename));
String[] row = null;
csvReader.readNext(); // to skip the headers
while((row = csvReader.readNext()) != null) 
{
  double val = Double.parseDouble(row[0]); // !!!
}
csvReader.close();

该行double val = Double.parseDouble(row[0])导致以下错误消息:

java.lang.NumberFormatException:对于输入字符串:“1,167.40”

如何解决这个问题?

PS 对于其他值,类似111.64此错误不会出现。

4

5 回答 5

14

,错误位于输入中间的逗号中。一个快速的肮脏解决方案是在将其解析为double.

double val = Double.parseDouble(row[0].replaceAll(",", ""));

更好的解决方案是使用 aNumberFormat来处理这个问题:

//assumes your server already has English as locale
NumberFormat nf = NumberFormat.getInstance(); /
//...
double val = nf.parse(row).doubleValue();
于 2013-09-12T07:52:05.200 回答
7

您应该使用特定于语言环境的格式:

NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH);
myNumber = nf.parse(myString);

一些国家交换句号和逗号;(例如,Locale.FRENCH 中的“1.167,40”),因此首先去除逗号是不安全的。

于 2013-09-12T07:53:52.317 回答
4

这是因为字符“,”(逗号)。此处的数据代表特定语言环境。因此,您应该先使用语言环境信息将数据格式化为十进制,然后再解析。

一个这样的例子是

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class JavaMain {
    public static void main(String[] args) {
        String numberString = "2.105,88";
        //using casting
        try {
            DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.GERMAN);
            df.setParseBigDecimal(true);
            BigDecimal bd = (BigDecimal) df.parseObject(numberString);
            System.out.println(bd.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
        try {
            BigDecimal bd1 = new BigDecimal(nf.parse(numberString).toString());
            System.out.println(bd1.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
于 2013-09-12T07:51:54.177 回答
3

Double.parseDouble()不喜欢,您作为参数提供的字符串。您是否尝试过从,输入中删除?我假设 1,167.40 与 1167.40 相同。

你可以试试:

double val = Double.parseDouble(row[0].replace(',' , '');
于 2013-09-12T07:55:39.740 回答
2

尝试

NumberFormat.getInstance().parse(row[0]) 代替Double.parseDouble()

于 2013-09-12T07:53:20.657 回答