将持续时间从字符串转换为浮点数

时间:2010-10-19 14:01:17

标签: java android parsing

我正在研究跟踪任务持续时间的Android应用程序。在内部,它将这些持续时间保存为表示在任务上花费了多少小时的浮点数。因此,30分钟将是0.5,1小时将是1,等等。我已经将所有代码工作得很好,以及将这些代码转换为hh:mm格式以便于阅读的代码。

但是,还有一个方面是用户可以使用字符串输入框手动更改此值。以下输入都应视为有效:

“1:30”=> 1.5 “1.83”=> 1.83 “0.5”=> 0.5

我不在乎用户是否输入类似“0:90”的内容,这将是1.5小时。

这是我目前的(未经测试的)解决方案。只是想知道是否有更好的方法来解决这个问题:

public static float HoursToFloat(String tmpHours) {
    float result = 0;
    tmpHours = tmpHours.trim();

    // Try converting to float first
    try
    {
        result = Float.parseFloat(tmpHours);
    }
    catch(NumberFormatException nfe)
    {
        // OK so that didn't work.  Did they use a colon?
        if(tmpHours.contains(":"))
        {
            int hours = 0;
            int minutes = 0;
            int locationOfColon = tmpHours.indexOf(":");
            hours = Integer.parseInt(tmpHours.substring(0, locationOfColon-1));
            minutes = Integer.parseInt(tmpHours.substring(locationOfColon+1));
            result = hours + minutes*60;
        }
    }

    return result;
}

2 个答案:

答案 0 :(得分:4)

这对我来说非常合适。只有我能想到的其他事情是,如果你想利用自动装箱那么你可以把第一部分写成

public static float HoursToFloat(String tmpHours) throws NumberFormatException {
     float result = 0;
     tmpHours = tmpHours.trim();

     // Try converting to float first
     try
     {
        result = new Float(tmpHours);
     }
     catch(NumberFormatException nfe)
     {
         // OK so that didn't work.  Did they use a colon?
         if(tmpHours.contains(":"))
         {
             int hours = 0;
             int minutes = 0;
             int locationOfColon = tmpHours.indexOf(":");
             try {
                  hours = new Integer(tmpHours.substring(0, locationOfColon-1));
                  minutes = new Integer(tmpHours.substring(locationOfColon+1));
             }
             catch(NumberFormatException nfe2) {
                  //need to do something here if they are still formatted wrong.
                  //perhaps throw the exception to the user to the UI to force the user
                  //to put in a correct value.
                  throw nfe2;
             }

             //add in partial hours (ie minutes if minutes are greater than zero.
             if(minutes > 0) {
                 result = minutes / 60;
             }

             //now add in the full number of hours.
             result += hours;
         }
     }

     return result;
 }

当然,这并非完全不同。只是允许您设置为对象,然后像基元一样操作。否则你看起来很不错。我在最后的计算中使用括号。我知道多重操作是一个比添加更高的操作顺序,任何优秀的Java开发人员都应该知道。但是括号使得后来出现的读者/开发者更清楚,他可能是Java的新手。

另外,你需要在下面再试一次,因为你也可以在整数转换器上炸弹。因为你带来了一个String,你不能保证用户不会放入像'asinboinseuye:ysousieu'这样的东西。是的,你可以在UI中防止这种情况(到某一点),但你应该仍然可以将保护放在方法中,如上所示。然后,如果由于某种原因它仍然不是数字,你可以将它扔到用户界面,然后向用户显示一条消息,告诉他们输入你认为可以接受的格式的数字。

否则,看起来很棒。

答案 1 :(得分:1)

你的方法基本上没问题,尽管那里有一堆虫子;如果输入不是float并且不包含冒号,则函数将返回0,并且应该将分钟除以60,而不是乘以。