在循环内部时子字符串函数出错

时间:2013-12-01 06:28:03

标签: java replace substring

我试图找出用户的输入是十进制还是分数或混合分数,当有小数的分数时我想将小数替换为整数,这样它就是一个合适的混合分数
例如: 输入:2.23 1/2 预期产量:2 1/2

public class DecimalOrFraction {
    public static void main(String args[]){
        String partOfString;
        String[] s = { "0000.2","2","2.222 1/2","1 2/2", "0"};
        for (int x = 0 ;x<s.length;x++) {
            if(s[x].matches("[1-9]{1}\\d{0,3}([.]\\d{1,3}\\s{0,1})?")){
                System.out.println(x+") "+Float.valueOf(s[x])+"  ----   Decimal");
            }
            else if(s[x].matches("[1-9]{1,5}([.]\\d{1,3})?\\s[1-9]{1}\\d{0,2}([/]\\d{0,3})?")){
                partOfString = s[x].substring( s[x].lastIndexOf("."), s[x].lastIndexOf(" ")); //HAVING AN ERROR
                s[x] = s[x].replace(partOfString," "); 
                System.out.println(x+") "+s[x]+"  ----  Fraction");
            }
            else if(s[x].matches("[1-9]\\d{0,4}[/]\\d{0,3}")){
                System.out.println(x+") "+s[x]+"  ----  also Fraction");
            }
            else{
                System.out.println(x+") "+s[x]+"  ----  ERROR/Zero");   
            }      
        }
    }
}

还有其他方法可以让这项工作没有任何错误吗?

2 个答案:

答案 0 :(得分:0)

如果你最多只能有两个独立的部分,那么你可以使用String.split()并拆分“”空格。然后,如果你有两个部分,它更容易使用。如果你有一个简单的条件。我不认为这个混乱的正则表达式需要。

多种情况下,如果你有多个空格,只需针对两种情况中的任何一种,针对正则表达式调用每个结果的分割字符串,然后按照这种方式处理。

答案 1 :(得分:0)

发生错误是因为“1 2/2”中没有点来取索引 由于匹配使用RegEx,为什么不使用RegEx进行更换? 这是重构整个事情的过程。

private static final Pattern DECIMAL = Pattern.compile("\\d*\\.?\\d+");
private static final Pattern FRACTION = Pattern.compile("\\.\\d+(\\s+\\d+/\\d+)");

public static void main(String args[]) {
    String[] samples = {"0000.2", "2", "2.222 1/2", "1 2/2", "0"};

    for (String sample : samples) {
        if (DECIMAL.matcher(sample).matches()) {
            float decimal = Float.parseFloat(sample);
            System.out.println(decimal + (decimal == 0 ? "\tERROR/Zero" : "\tDecimal"));
        }
        else {
            String fraction = FRACTION.matcher(sample).replaceFirst("$1");
            System.out.println(fraction + "\tFraction");
        }
    }
}