我正在研究跟踪任务持续时间的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;
}
答案 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,而不是乘以。