1

今天早上我正在做课堂作业,我想尝试解决迄今为止我在所有队友计划中注意到的问题;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”,其余部分会丢失在某处。

这第二个例子是我试图弄清楚如何解决的问题。

编辑:

下面大卫的建议能够解决这个问题。绕过发送一个 int。直接将其作为字符串发送,然后转换(我总是听说这被描述为强制转换)为所需的变量类型。更正了上面 Main 方法中的代码。

附带说明一下,如果您打算使用它,即使替换要容易得多,请务必在 deleteSpaces 中的 if 语句中添加一个 && 检查,以确保 if 语句仅在您不在最终数组元素上时执行数组。如果您通过 i3 将最后一个元素值传递给下一个将 i4 设置为 i3 的值的 for 循环,我认为它将触发 OutOfBounds 错误,因为它只会检查最后一个元素 - 1。

4

3 回答 3

3

如果您想摆脱StringusereplaceAll(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()),而不是将输入读取为Stringusing nextLine(),删除空格然后尝试将其转换为适当的格式.

这对我来说似乎很好用:

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

于 2012-09-24T18:03:05.043 回答
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"

这将替换任何非数字、非句点字符,以便您在输入中只剩下这些字符。请参阅 javadocsPattern以了解一些关于正则表达式的知识,或搜索在线提供的众多教程之一。

编辑:另一句话,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), 自动基于空格分隔。

于 2012-09-24T18:05:42.420 回答
1

我猜您正在使用 main 方法中的第一个参数。如果您的主要方法看起来像这样:

public static void main(String[] args){
  System.out.println(deleteSpaces(args[0]);
}

您的问题是,空格将传递给您的主要方法的参数分开。所以像这样运行你的课程:

java MyNumberConverter 22.2 33

第一个参数 arg[0] 是“22.2”,第二个参数 arg[1] 是“33”

但就像其他人建议的那样,String.replace无论如何都是一种更好的方法。

于 2012-09-24T18:12:16.270 回答