Работа со временем в спортивном приложении C # - PullRequest
0 голосов
/ 02 июля 2018

Я создаю приложение, которое может рассчитывать время на гребном тренажере в качестве небольшого эксперимента для себя. Используя эти уравнения, вы можете рассчитать разделение (сколько времени займет 500 м), общее расстояние или общее время ...

расстояние = (время / разделение) * 500

сплит = 500 * (время / расстояние)

время = разделение * (расстояние / 500)

расстояние показывается в метрах (это простой бит), но два раза я хочу показать его в формате mm: ss.fff (например, 2: 00.00).

Моя первая проблема : когда я пытаюсь разобрать введенную строку, используя TimeSpan parsedSplitTime = TimeSpan.ParseExact(splitInput, "c", provider); Требуется строка ...

A) Чтобы иметь 0 перед минутой, его нельзя вводить как 2: 00.00, а как 02: 00.00, что для простоты использования не очень хорошо, и я не могу просто добавить это к строка в задаче B, например, пользователь может ввести 12 минут.

B) Я должен добавить «0,00:» в начало строки, чтобы он отформатировал

string splitInput = "0.00:" + enteredSplit.Text;

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

Это код, который я использую для определения общего времени.

string splitInput = "0.00:" + enteredSplit.Text;
TimeSpan parsedSplitTime = TimeSpan.ParseExact(splitInput, "c", provider);

double distanceAsInt = Int64.Parse(enteredDistance.Text);
distanceAsInt = distanceAsInt / 500;

double totalTimeMilli = parsedSplitTime.TotalMilliseconds * distanceAsInt;

TimeSpan timeReadable = TimeSpan.FromMilliseconds(totalTimeMilli).;
string enteredTimeAsString = timeReadable.ToString();
enteredTimeAsString = enteredTimeAsString.Remove(0, 3);
enteredTime.Text = $"{enteredTimeAsString}.00";

Заранее всем спасибо за помощь! А если вам нужны какие-либо подробности, просто прокомментируйте и добавьте их здесь!

Входные данные вводятся вручную, но я намекнул, что их нужно вводить как 0: 00.00, но в настоящее время вам нужно сделать 00: 00.00, и я хочу, чтобы вывод был 0: 00.00

определение поставщика CultureInfo provider = CultureInfo.InvariantCulture;

вводится в виде строки

1 Ответ

0 голосов
/ 02 июля 2018

Один из способов решения этой проблемы - сначала проанализировать ввод (в минутах, секундах и миллисекундах) и создать из этого ввода объект TimeSpan, используя конструктор, который занимает дни, часы, минуты, секунды и миллисекунды. ,

Поскольку мы не знаем точный формат ввода, мы можем использовать string.Split, чтобы разделить строку на части, о которых мы знаем, используя символ : в качестве разделителя:

/// <summary>
/// Returns a timespan from an input string that specifies minutes:seconds
/// </summary>
/// <param name="input">"minutes:seconds", where seconds can be a double</param>
/// <returns>Timespan representation of the input string</returns>
private static TimeSpan ParseMinSecMS(string input)
{
    if (string.IsNullOrWhiteSpace(input))
        throw new ArgumentException("input cannot be null, empty, or whitespace");

    var parts = input.Split(':');
    var minutes = "00";
    string seconds;
    if (parts.Length > 1)
    {
        minutes = parts[0].PadLeft(2, '0');
        seconds = parts[1].PadRight(1, '0');
    }
    else
    {
        seconds = parts[0].PadRight(1, '0');
    }

    return TimeSpan.Parse($"0.00:{minutes}:{seconds}");
}

Тогда вы можете использовать этот метод так:

private static void Main(string[] args)
{
    var inputs = new List<string>
    {
        "2",
        "2.3",
        "1:2.34",
        "25:32.908",
        "1.2345"
    };

    foreach (var input in inputs)
    {
        Console.WriteLine(ParseMinSecMS(input).ToString("mm\\:ss\\.ffff"));
    }

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

выход

enter image description here

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