Добавьте два раза в формате MM: SS и верните в виде строки с максимальной точностью - PullRequest
0 голосов
/ 08 июня 2019

Я хочу написать функцию, которая добавляет 2 строки, одну в формате MM: ss, а другую задают только в виде секунд, а затем сложение (с учетом дополнительных секунд) возвращает их в том же формате с максимальными уровнями точности. // пример: "1:30" + "65" = "2:35"

Я пытался со своей стороны, но я думаю, что это можно сделать более общим, см. Код

public static string maxLevel(string s1, string s2)
        {
            string[] parts1 = null;
            string[] parts2 = null;

            if (s1.Contains(":"))
            {
                parts1 = s1.Split(':');
            }

            if (s2.Contains(":"))
            {
                parts2 = s2.Split(':');
            }


            int minutes1 = 0;
            int seconds1 = 0;
            int minutes2;
            int seconds2 = 0;
            int newSeconds = 0;
            int newMinutes = 0;
            int carry = 0;

            if (parts1 != null && parts1.Length > 1)
            {
                minutes1 = Convert.ToInt32(parts1[0]);
               // int HoursInminutes = (12 + (minutes % 60)) * 60;
                seconds1 = Convert.ToInt32(parts1[1]);
            }

            else
            {
                seconds1 = Convert.ToInt32(s1);
                int minutes = seconds1 / 60;
                if (minutes >= 1)
                {
                    carry = seconds1 - 60;
                    //newSeconds = seconds2 + carry;
                }

                newMinutes = minutes;
                newSeconds = carry;
            }

            if (parts2 != null && parts2.Length > 1)
            {
                minutes2 = Convert.ToInt32(parts2[0]);
                seconds2 = Convert.ToInt32(parts2[1]);
                //newMinutes = minutes2;
                newMinutes += minutes2;
                newSeconds += seconds2;
            } 


            else
            {
                seconds2 = Convert.ToInt32(s2);
                int minutes = seconds2/60;
                if(minutes >= 1)
                {
                    carry = seconds2 - 60;
                    newSeconds = seconds1 + carry;
                    newMinutes = minutes1 + minutes;
                }
                else
                {
                    carry = seconds2 - seconds1;
                    newSeconds = carry;
                    newMinutes = 1 + minutes1;
                }


            }

            return newMinutes + ":" + newSeconds;

        }

Когда я изменяю s1 на 55 секунд и s2 на 1:30, этот код не работает. Я думаю, что это нуждается в некоторой модификации, может кто-нибудь, пожалуйста, помогите или покажите мне правильный путь в C #

1 Ответ

1 голос
/ 08 июня 2019

Поскольку вы хотите, чтобы пользователь мог указать более 59 секунд (и / или минут), я не думаю, что TimeSpan.TryParseExact сработает, поскольку вы не можете передать ему более 59 секунд или минут,Эти поля должны быть 0-59.

. Однако вы можете написать собственный синтаксический анализатор, который разбивает входную строку на символ двоеточия (:), а затем использует int.TryParse, чтобы попытаться проанализировать результирующие части.в целые числа, а затем вы можете использовать TimeSpan.FromSeconds, чтобы передать любое количество секунд для создания нового объекта TimeSpan, и вы можете использовать метод .Add, чтобы добавить другой промежуток времени, созданный из части минут, если она была указана.

Сначала мы можем написать метод, который будет возвращать TimeSpan из строки в формате «[integer]» или «[integer]: [integer]»:

public static TimeSpan CustomParse(string input)
{
    // Split the string on the ':' character
    var parts = input?.Split(':');

    // Make sure we have something to work with
    if (parts == null || parts.Length == 0) 
        throw new FormatException("input format must be \"%m:%s\" or \"%s\"");

    int seconds;

    // Only a single number represents seconds
    if (parts.Length == 1)
    {
        if (int.TryParse(parts[0], out seconds))
        {
            return TimeSpan.FromSeconds(seconds);
        }
    }
    // Otherwise the first number is minutes and the second one is seconds
    else
    {
        int minutes;
        if (int.TryParse(parts[0], out minutes) &&
            int.TryParse(parts[1], out seconds))
        {
            return TimeSpan.FromSeconds(seconds).Add(TimeSpan.FromMinutes(minutes));
        }
    }

    // If we haven't returned anything yet, there was an error in the format
    throw new FormatException("input format must be \"%m:%s\" or \"%s\"");
}

Затем мы можем написать другую функцию, которая принимает две строки, преобразует их в интервалы времени, используя наш метод выше, и возвращает результат сложения их вместе в виде строки:

public static string Add(string s1, string s2)
{
    return CustomParse(s1).Add(CustomParse(s2)).ToString("%m\\:%s");
}

Теперь мы можем проверить это с помощью вашегоПримеры строк:

private static void Main()
{
    string first = "1:30";
    string second = "65";
    string result = Add(first, second);

    Console.WriteLine($"{first} + {second} = {result}");

    GetKeyFromUser("\nDone! Press any key to exit...");
}

Выход

Image showing that the result is 2:35

...