Преобразование продолжительности времени из строки в число с плавающей точкой - PullRequest
0 голосов
/ 19 октября 2010

Я работаю над приложением для Android, которое отслеживает время выполнения задач.Внутренне он сохраняет эти длительности как число с плавающей запятой, представляющее, сколько часов было потрачено на задачу.Таким образом, 30 минут - это 0,5, 1 час - 1 и т. Д. У меня есть весь этот код, который отлично работает, вместе с кодом для преобразования их в формат чч: мм для более удобного чтения.

Однако естьаспект, в котором пользователь может вручную изменить это значение, используя поле ввода строки.Следующие данные должны считаться действительными:

"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 ]

4 голосов
/ 19 октября 2010

Мне это очень нравится.Единственное, о чем я мог подумать: если вы хотите воспользоваться преимуществами автобокса, вы можете написать первую часть как

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.

Кроме того, вам понадобится еще одна попытка поймать ниже, потому что вы можете также бомбить конвертеры Integer.Поскольку вы вводите строку, вы не можете гарантировать, что пользователь не введет что-то вроде «asinboinseuye: ysousieu».Да, вы можете защитить от этого в пользовательском интерфейсе (до некоторой степени), но вам все же, вероятно, следует включить защиту в метод, как показано выше.Затем, если по какой-либо причине он по-прежнему не является числовым, вы можете выбросить его в пользовательский интерфейс и затем предоставить пользователю сообщение с просьбой ввести число в тех форматах, которые вы считаете приемлемыми.

В противном случае выглядит великолепно.

1 голос
/ 19 октября 2010

Ваш подход в основном нормальный, хотя там есть куча ошибок;если входные данные не являются числами с плавающей точкой и не содержат двоеточия, ваша функция вернет 0, и вы должны делить минуты на 60, а не умножать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...