Java parseFloat似乎表现不一致

时间:2009-11-25 05:54:40

标签: java string

我确信这与我对行为的理解有关,而不是parseFloat上任何不一致的行为,但请耐心等待......

如果我输入格式为“IDCODE:(3.5)”,其中IDCODE可能是几个不同的预定义字符串,并且保证始终是括号,并且保证括号之间的数字

我正在尝试将所有输入消化到IDCODE桶中并累计值,因此需要抓住括号之间的任何内容并将其转换为浮点数以便我可以求和

为什么以下不起作用?

Float tot = 0;
String idCode = "";
while( !input.isEmpty() )
{
    idCode = GetIdCode(input);
    tot = tot + Float.parseFloat( input.substring( 
                                  input.indexOf( "(", input.indexOf( idCode ) ) + 1, 
                                  input.indexOf( ")", input.indexOf( idCode ) ) ) );
}

(抛出数字格式异常)

以下的工作

Float tot = 0;
String idCode = "";
while( !input.isEmpty() )
{
    idCode = GetIdCode(input);
    String temp = input.substring( 
                  input.indexOf( "(", input.indexOf( idCode ) ) + 1, 
                  input.indexOf( ")", input.indexOf( idCode ) ) );
    tot = tot + Float.parseFloat( temp );
}

这对我来说似乎很奇怪 - 我通过保存到临时变量而造成的差异是什么?

4 个答案:

答案 0 :(得分:4)

当你的代码没有按照你认为的那样工作时,是时候进行一些老式的调试了。你可以获得更多的好处,而不是一百个人在这里的建议,除非建议当然要做一些好的老式调试: - )

将您的非工作人员更改为:

while( !input.isEmpty() )
{
    idCode = GetIdCode(input);

    // New lines below.
    System.out.println ("input = [" + input + "]");
    System.out.println ("idCode = [" + idCode + "]");

    int i1 = input.indexOf(idCode);
    System.out.println ("offst1 = [" + i1 + "]");

    int i2 = input.indexOf("(",i1);
    System.out.println ("offst2 = [" + i2 + "]");

    int i3 = input.indexOf(")",i1);
    System.out.println ("offst3 = [" + i3 + "]");

    String s1 = input.substring(i2+1,i3);
    System.out.println ("strng1 = [" + s1 + "]");

    float f1 = Float.parseFloat(s1);
    System.out.println ("float1 = [" + f1 + "]");
    // New lines above.

    tot = tot + Float.parseFloat( input.substring( 
        input.indexOf( "(", input.indexOf( idCode ) ) + 1, 
        input.indexOf( ")", input.indexOf( idCode ) ) ) );

然后让我们知道输出是什么,尽管你很可能会自己看到问题。

这些println语句应该只涵盖所有可能出现的问题,如果它实际上存在于该代码中。

例如,以下项目:

public class xx {
    public static void main(String args[]) {
        String idCode = "CT";
        String input = "fgdfgdg CT: (2.57)";

        System.out.println ("input  = [" + input + "]");
        System.out.println ("idCode = [" + idCode + "]");

        int i1 = input.indexOf(idCode);
        System.out.println ("offst1 = [" + i1 + "]");

        int i2 = input.indexOf("(",i1);
        System.out.println ("offst2 = [" + i2 + "]");

        int i3 = input.indexOf(")",i1);
        System.out.println ("offst3 = [" + i3 + "]");

        String s1 = input.substring(i2+1,i3);
        System.out.println ("strng1 = [" + s1 + "]");

        float f1 = Float.parseFloat(s1);
        System.out.println ("float1 = [" + f1 + "]");

        System.out.println ("full   = [" + Float.parseFloat( input.substring( 
            input.indexOf( "(", input.indexOf( idCode ) ) + 1, 
            input.indexOf( ")", input.indexOf( idCode ) ) )) + "]");
    }
}

给了我:

input  = [fgdfgdg CT: (2.57)]
idCode = [CT]
offst1 = [8]
offst2 = [12]
offst3 = [17]
strng1 = [2.57]
float1 = [2.57]
full   = [2.57]

特别是,最后一行打印好的事实让我相信你所展示的代码没有任何问题。问题在于其他地方。

答案 1 :(得分:1)

真正的问题不在于parseFloat。这是你用字符串参数调用它,包括数字之前和/或之后的字符,或者用空字符串。

问题中没有足够的代码来确定究竟发生了什么,但如果我试图解决这个问题,我要么使用调试器单步执行代码,要么添加一些System.err.println(...)语句。特别是,请关注您传递给parseFloat的字符串中的内容。

答案 2 :(得分:0)

考虑在解析之前修剪/替换前导空格temp,它们也可以触发异常:

tot = tot + Float.parseFloat( temp.trim() ); //

//或

tot = tot + Float.parseFloat( temp.replace(" ","") );

答案 3 :(得分:0)

让您的生活更轻松,代码更易理解,更少重复:

Float tot = 0;

while( !input.isEmpty() )
{
    final String idCode;
    final int    idIndex;
    final int    startIndex;
    final int    endIndex;   
    final String value; 

    idCode     = GetIdCode(input);
    idIndex    = input.indexOf( idCode );
    startIndex = input.indexOf( "(", idIndex) + 1;
    endIndex   = input.indexOf( ")", idIndex);
    value      = input.substring(startIndex, endIndex);
    tot        = tot + Float.parseFloat();
}

将每个电话分开后,您可以轻松完成以下任务: - 检查*索引变量的-1(表示无效输入) - 对任何值(包括值)执行System.out.println,这样您就可以轻松查看错误了(我会做System.out.println(“value = \”“+ value +”\“” );)

遵循的一条好规则永远不会将方法的结果作为方法参数或控制语句传递,这会在出现问题时更难调试。