代码之家  ›  专栏  ›  技术社区  ›  Geowil

浮点/内部/双精度的空间替换

  •  1
  • Geowil  · 技术社区  · 13 年前

    今天早上我正在做一项课堂作业,我想尝试解决我在所有队友项目中注意到的一个问题;int/foat/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);       
     }
    }
    

    这是一个类,请注意,我正在使用float,但我制作它是为了使它可以用于任何类型,只要它可以被强制转换为字符串:

    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语句仅在您不在cArray的最后一个数组元素上时执行。如果你通过i3将最后一个元素的值传递给下一个for循环,该循环将i4设置为i3的值,我认为这将触发OutOfBounds错误,因为它只会检查最后的元素-1。

    3 回复  |  直到 13 年前
        1
  •  3
  •   David Kroukamp    13 年前

    如果你想去掉 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() )而是将输入作为 一串 使用 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

        2
  •  2
  •   Brian    13 年前

    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"
    

    这将替换任何非数字、非句点字符,这样输入中只剩下这些字符。请参阅的javadocs Pattern 学习一些正则表达式,或者搜索在线教程中的一个。

    编辑: 另一句话, 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 可以在构造时采用分隔符(例如, new Scanner(System.in, ",./ ") 将在上定界 , , . , / )“默认构造函数, new Scanner(System.in) ,根据空白自动进行分隔。

        3
  •  1
  •   Tim Büthe    13 年前

    我猜你使用的是主方法中的第一个论点。如果您的主方法看起来像这样:

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

    你的问题是,空格分隔了交给主方法的参数。所以像这样管理你的课程:

    java MyNumberConverter 22.2 33
    

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

    但正如其他人所建议的那样, String.replace 是一种更好的方法。