Float / Int / Double的空间更换

时间:2012-09-24 17:55:53

标签: java floating-point

我今天早上正在上课,我想尝试解决迄今为止我在所有队友计划中注意到的问题。事实上,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错误,我认为因为它只会检查最后一个元素 - 。

3 个答案:

答案 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无论如何都是更好的方法。