Java 分析文件中某行的双精度字符时忽略字母
我正在尝试逐行从文件导入一些数据。我要从may或may中读取的某一行末尾可能有或没有“kB”(千字节),我想解析这一行中的double,但我的程序给了我java.lang.NumberFormatExceptionJava 分析文件中某行的双精度字符时忽略字母,java,parsing,double,Java,Parsing,Double,我正在尝试逐行从文件导入一些数据。我要从may或may中读取的某一行末尾可能有或没有“kB”(千字节),我想解析这一行中的double,但我的程序给了我java.lang.NumberFormatException while(inputStream.hasNextLine()) { inputStream.nextLine(); // Skips a line between each object String sn = inputStream
while(inputStream.hasNextLine())
{
inputStream.nextLine(); // Skips a line between each object
String sn = inputStream.nextLine();
String sa = inputStream.nextLine();
double ss = Double.parseDouble(inputStream.nextLine()); // This is where the problem occurs
int sd = Integer.parseInt(inputStream.nextLine());
addSong(sn, sa, ss, sd); // Send the four variables for Song() to the addSong method
}
inputStream.close();
我觉得我可以在这里使用indexOf(),但我不确定如何使用
干杯 如果您只想删除“kB”,可以尝试以下操作:
String line = inputStream.nextLine();
line = line.replaceFirst("kB", "");
double ss = Double.parseDouble(line);
如果要删除所有无法由parseDouble
解析的内容,则必须使用regexp:
String line = inputStream.nextLine();
line = line.replaceAll("[^-\\d.]", "");
double ss = Double.parseDouble(line);
此regexp将删除所有不是:
- 一个数字(如果您对匹配UTF-8号码不感兴趣,可以使用
而不是0-9
)\\d
- 或点(用于小数部分)
- 或减号(用于负数)
replaceAll(“[^\\d.]”,“”)去掉该行中的所有非数字/点即可。
:
这使它保持在一行
double ss = Double.parseDouble(inputStream.nextLine().replaceAll("[a-zA-Z]", ""));
这将有助于从A-Z中删除所有字符,而不考虑大小写。不要害怕代码中有描述性标识符名称。像
sn
这样的名称是模糊的,但是像songName
这样的名称会更清晰。谢谢David,我在我的歌曲类中使用了更多描述性术语,但我只是用来传递参数。这是一个非常小的程序,但你是对的,我可能应该用更具描述性的名称。谢谢,弗洛伦特。我不知道replaceAll():)没问题;)很高兴它帮了你,不用担心。不要因为没有被选为公认的答案而吃酸葡萄,但我要指出的是,如果你得到的是字母以外的任何其他字符,甚至包括空格,你将得到与你目前得到的公认答案相同的错误。然而,我的代码将保护您免受可能出现的所有任性字符的攻击。Cheers M8带replaceAll(“[^\\d.]”,“”)的两个答案中的一个应该是可接受的答案,而replaceAll(“[a-zA-Z]”,“”)并不是一个好的解决方案。
double ss = Double.parseDouble(inputStream.nextLine().replaceAll("[a-zA-Z]", ""));