我今天早上正在上课,我想尝试解决迄今为止我在所有队友计划中注意到的问题。事实上,int / float / double中的空格会导致Java崩溃。
为了解决这个问题,我有一个非常疯狂的想法,但它在某些情况下确实有用。然而问题是,这并不总是有效,我无法弄清楚为什么。这是我的“主要”方法:
import java.util.Scanner; //needed for scanner class
public class Test2
{
public static void main(String[] args)
{
BugChecking bc = new BugChecking();
String i;
double i2 = 0;
Scanner in = new Scanner(System.in);
System.out.println("Please enter a positive integer");
while (i2 <= 0.0)
{
i = in.nextLine();
i = bc.deleteSpaces(i);
//cast back to float
i2 = Double.parseDouble(i);
if (i2 <= 0.0)
{
System.out.println("Please enter a number greater than 0.");
}
}
in.close();
System.out.println(i2);
}
}
所以这是类,请注意我正在使用浮点数,但是我这样做是为了它可以用于任何类型,只要它可以转换为字符串:
public class BugChecking
{
BugChecking()
{
}
public String deleteSpaces(String s)
{
//convert string into a char array
char[] cArray = s.toCharArray();
//now use for loop to find and remove spaces
for (i3 = 0; i3 < cArray.length; i3++)
{
if ((Character.isWhitespace(cArray[i3])) && (i3 != cArray.length)) //If current element contains a space remove it via overwrite
{
for (i4 = i3; i4 < cArray.length-1;i4++)
{
//move array elements over by one element
storage1 = cArray[i4+1];
cArray[i4] = storage1;
}
}
}
s = new String(cArray);
return s;
}
int i3; //for iteration
int i4; //for iteration
char storage1; //for storage
}
现在,我们的目标是从数组中删除空格,以便解决帖子开头所述的问题,以及我可以告诉这段代码应该实现的内容,但是只有在第一个字符时才能实现。输入是空间。
例如,如果我输入“2.0332”,则输出为“2.0332”。
但是,如果我输入“2.03 445”,则输出为“2.03”,其余部分会丢失。
第二个例子就是我想弄清楚如何解决的问题。
编辑:
David的建议可以解决这个问题。绕过发送一个int。直接发送它作为一个字符串,然后转换(我总是听到这描述为铸造)到所需的变量类型。更正了Main方法中上面的代码。
有一点注意事项,如果您计划使用它,即使更换更容易,请务必添加&amp;&amp;检查deleteSpaces中的if语句,以确保if语句仅在不在cArray的最终数组元素上时执行。如果你通过i3将最后一个元素值传递给下一个for循环,它将i4设置为i3的值,它会触发一个OutOfBounds错误,我认为因为它只会检查最后一个元素 - 。
答案 0 :(得分:3)
如果你想摆脱String
使用replaceAll(String regex,String replacement)
或replace(char oldChar, char newChar)
之间的所有空格:
String sBefore = "2.03 445 ";
String sAfter = sBefore.replaceAll("\\s+", "");//replace white space and tabs
//String sAfter = sBefore.replace(' ', '');//replace white space only
double i = 0;
try {
i = Double.parseDouble(sAfter);//parse to integer
} catch (NumberFormatException nfe) {
nfe.printStackTrace();
}
System.out.println(i);//2.03445
<强>更新强>
查看您的代码片段,问题可能是您直接将其作为float / int / double读取(因此输入空格会停止nextFloat()
)而是使用{将{\ n} String
作为nextLine()
读取{1}},删除空格,然后尝试将其转换为适当的格式。
这似乎对我很好:
public static void main(String[] args) {
//bugChecking bc = new bugChecking();
float i = 0.0f;
String tmp = "";
Scanner in = new Scanner(System.in);
System.out.println("Please enter a positive integer");
while (true) {
tmp = in.nextLine();//read line
tmp = tmp.replaceAll("\\s+", "");//get rid of spaces
if (tmp.isEmpty()) {//wrong input
System.err.println("Please enter a number greater than 0.");
} else {//correct input
try{//attempt to convert sring to float
i = new Float(tmp);
}catch(NumberFormatException nfe) {
System.err.println(nfe.getMessage());
}
System.out.println(i);
break;//got correct input halt loop
}
}
in.close();
}
修改强>
作为旁注,请以大写字母开始所有班级名称,即bugChecking
班级应为BugChecking
同样适用于test2
班级Test2
答案 1 :(得分:2)
String
个对象具有允许您执行此类操作的方法。你特别想要的是String.replace
。这几乎就是你想要为你做的事情。
String input = " 2.03 445 ";
input = input.replace(" ", ""); // "2.03445"
您还可以使用正则表达式来替换空格。例如,要摆脱不是数字或句号的所有内容:
String input = "123,232 . 03 445 ";
input = input.replaceAll("[^\\d.]", ""); // "123232.03445"
这将替换任何非数字,非句点字符,以便您只留下输入中的那些字符。请参阅Pattern
的javadocs以了解正则表达式,或搜索在线提供的众多教程之一。
修改另一条评论,String.trim
会从字符串的开头和结尾删除所有空格,以便将" 2.0332"
转换为"2.0332"
:
String input = " 2.0332 ";
input = input.trim(); // "2.0332"
编辑2 :在您的更新中,我现在看到了问题。 Scanner.nextFloat
正在打破空间。如果您将代码更改为使用Scanner.nextLine
,请执行以下操作:
while (i <= 0) {
String input = in.nextLine();
input = input.replaceAll("[^\\d.]", "");
float i = Float.parseFloat(input);
if (i <= 0.0f) {
System.out.println("Please enter a number greater than 0.");
}
System.out.println(i);
}
该代码将正确接受您输入"123,232 . 03 445"
之类的内容。使用任何解决方案代替我的replaceAll
,它都可以使用。
Scanner.nextFloat
会根据空格自动拆分输入。 Scanner
在构建时可以使用分隔符(例如,new Scanner(System.in, ",./ ")
将分隔,
,.
,/
和) “默认构造函数
new Scanner(System.in)
会根据空格自动分隔。
答案 2 :(得分:1)
我猜你正在使用main方法中的第一个参数。如果你的main方法看起来像这样:
public static void main(String[] args){
System.out.println(deleteSpaces(args[0]);
}
你的问题是,空格将传递给你的main方法的参数分开。所以像这样运行你的课程:
java MyNumberConverter 22.2 33
第一个参数arg [0]是“22.2”而第二个参数arg [1]“33”
但正如其他人所说的那样,String.replace无论如何都是更好的方法。