Nano Hash - криптовалюты, майнинг, программирование

Как объединить целое число со строкой в ​​С#?

Я разрабатываю приложение Console для преобразования времени из 12-часового формата в 24-часовой формат:

ввод: 14:03:34 ожидаемый вывод: 14:03:34

Но я получаю 14:3:34 Ниже приведен фрагмент кода:

string[] arr_temp = Console.ReadLine().Split(':');

string time =  arr_temp[2].ToUpper().Contains("AM") ? "AM" : "PM";

string sec=string.Empty;

for (int i = 0; i < 2; i++)
{
   sec+= arr_temp[2][i];
}

int _hour = Int32.Parse(arr_temp[0])==0?0: Int32.Parse(arr_temp[0]); 

int _minute = Int32.Parse(arr_temp[1]) == 0 ? 0 : Int32.Parse(arr_temp[1]); 

int _sec = Int32.Parse(sec)==0?0: Int32.Parse(sec);

_hour = (time == "PM") ? _hour += 12 : _hour += 0;

_hour = (_hour < 10) ? '0' + _hour : _hour;

_minute = (_minute < 10) ? '0' + _minute : _minute;

_sec = (_sec < 10) ? '0' + _sec : _sec;

Я не получаю ожидаемого результата. Пожалуйста, предложите.


  • вы смотрели в DateTime.ToString()? 20.04.2017
  • В самом деле... вам на самом деле не следует заниматься форматированием или анализом самостоятельно. Сейчас самое время ознакомиться и с соглашениями об именах .NET. 20.04.2017
  • пожалуйста, проверьте stackoverflow. ком/вопросы/8337625/ 20.04.2017
  • ... и DateTime.ParseExact() 20.04.2017
  • Как я могу объединить его без использования функции DateTime? 20.04.2017
  • Вы идете об этом неправильно. Как говорит @Lucero, разберите строку на DateTime, а не пытайтесь сделать это самостоятельно. Таким образом, проблема конкатенации исчезает. 20.04.2017
  • Зачем тебе это? Это какой-то академический вопрос или у вас есть веская причина не использовать встроенный синтаксический анализ DateTime-s? 20.04.2017
  • Еще вопрос по колледжу/университету... 20.04.2017

Ответы:


1

Мне это кажется немного сложным, поскольку есть гораздо более простой способ отобразить переменную DateTime в 12- или 24-часовом формате.

Сначала вам нужно будет преобразовать вашу строку в допустимый объект DateTime. Существуют методы синтаксического анализа, которые вы можете использовать, но сначала вам нужно будет проверить входную строку, возвращенную пользователем, как действительную дату.

Используйте следующий код, чтобы преобразовать вашу строку в DateTime:

string dateString = "03/01/2009 10:00 AM";
DateTime date = DateTime.Parse(dateString); 

DateTime.Parse выдает исключение, если входная строка имеет неверный формат. Чтобы этого не произошло, используйте вместо этого DateTime.TryParse.

string dateString = "03/01/2009 10:00 AM";
DateTime dateTime;
if (DateTime.TryParse(dateString , out dateTime))
{
    Console.WriteLine(dateTime);
}

Затем вы можете отобразить переменную DateTime и отформатировать ее так, как хотите.

DateTime dateTime = DateTime.Now;
string str12Format = dateTime.ToString("hh:mm:ss tt"); //12 hours format
string str24Format = dateTime.ToString("HH:mm:ss tt"); //24 hours format
20.04.2017
  • На самом деле OP имеет дату и время как вывод из консоли в заданном формате, поэтому вам нужно создать DateTime-экземпляр впереди. 20.04.2017
  • @HimBromBeere Приведенный мной пример демонстрирует использование метода ToString для форматирования DateTime. Конечно, перед реализацией в код нужно будет внести изменения, но это зависит от OP. 20.04.2017
  • @MickyD Я обновил свой ответ объяснением того, как преобразовать исходную строку в объект DateTime. 20.04.2017

  • 2

    Попробуйте использовать DateTime.TryParseExact, а затем ToString, не повторяйте Microsoft и не изобретайте велосипед:

      string source = Console.ReadLine();
      DateTime date;
    
      // DateTime.TryParseExact supports many formats; that's why "12:34AM" will be accepted
      // DateTimeStyles.AllowWhiteSpaces let us be nice and allow, say "11 : 34 : 47 PM"
      if (DateTime.TryParseExact(
            source, 
            new string[] {"h:m:stt" , "h:mtt", "htt", "H:m:s", "H:m", "H"}, 
            CultureInfo.InvariantCulture, // or CultureInfo.CurrentCulture
            DateTimeStyles.AssumeLocal | DateTimeStyles.AllowWhiteSpaces, 
            out date)) 
        Console.WriteLine(date.ToString("HH:mm:ss"));
      else
        Console.WriteLine($"Sorry, {source} is not a valid date");
    
    20.04.2017

    3

    _hour в вашем коде является целым числом. Вы не можете объединить строку с целым числом. Но возможно и обратное.

    Поэтому вы должны использовать это вместо этого:

    int _hour = Int32.Parse(arr_temp[0])==0?0: Int32.Parse(arr_temp[0]); 
    int _minute = Int32.Parse(arr_temp[1]) == 0 ? 0 : Int32.Parse(arr_temp[1]); 
    int _sec = Int32.Parse(sec)==0?0: Int32.Parse(sec);
    
    _hour = (time == "PM") ? _hour += 12 : _hour += 0;
    
    String _hourS = (_hour < 10) ? '0' + _hour : _hour;
    String _minuteS = (_minute < 10) ? '0' + _minute : _minute;
    
    20.04.2017
  • Что не так с методами Parsexxx() в DateTime? 20.04.2017
  • @MickyD в их использовании нет ничего плохого, и они будут работать нормально. Я написал это решение только для того, чтобы сообщить OP, что неправильное приведение типов может вызвать ошибки в строго типизированных языках. 20.04.2017

  • 4

    Просто передайте ввод

        public static TimeSpan ConvertToAMPM(DateTime date)
        {
            return TimeSpan.Parse(date.ToString("h:mm tt", 
            CultureInfo.InvariantCulture));
        }
    
        public static TimeSpan ConvertTo24Hour(string time)
        {
            var cultureSource = new CultureInfo("en-US", false);
            var cultureDest = new CultureInfo("de-DE", false);
            var dt = DateTime.Parse(time, cultureSource);
            return TimeSpan.Parse(dt.ToString("t", cultureDest));
        }
    
    20.04.2017

    5

    Другие ответы до сих пор в основном касаются примера обработки DateTime, но они не объясняют, почему ваш код ломается.

    То, что вы пытаетесь сделать, это добавить начальный ноль к переменной int так же, как вы сделали бы это со строкой.

    Проблема в том, что внутреннее представление int — это просто само число, и оно не несет никакой информации о формате. Таким образом, он не может хранить информацию о начальных нулях. Это можно сделать только с помощью string, которые представляют собой не число, а набор символов.

    Итак, суть в том, что вам нужно видеть данные и их представление как две разные вещи. В общем, лучше всего хранить данные в исходной форме и преобразовывать их только в самый последний момент, когда это необходимо для отображения. Это также позволяет уважать культурные различия в представлении на дисплее.

    Многие базовые типы данных (включая int и DateTime и т. д.) являются форматируемыми. Это означает, что они могут быть преобразованы в строковое (отображаемое) представление относительно шаблона, описывающего, каким должно быть это представление. Для int такой шаблон может определять, что он должен иметь начальный ноль, например:

    string _hourDisplay = _hour.ToString("00");
    
    20.04.2017

    6

    Привет, Нишанк. Используйте этот код:

    string[] arr_temp = Console.ReadLine().Split(':');
    
    string time = arr_temp[2].ToUpper().Contains("AM") ? "AM" : "PM";
    string sec = arr_temp[2].Substring(0, 2);
    
    string _hour = "";
    if (time == "PM" && Int32.Parse(arr_temp[0]) < 12)
        _hour = (Int32.Parse(arr_temp[0]) + 12).ToString("D2");
    else if (time == "AM" && Int32.Parse(arr_temp[0]) == 12)
        _hour = "00";
    else
        _hour = Int32.Parse(arr_temp[0]).ToString("D2");
    
    string _minute = Int32.Parse(arr_temp[1]) == 0 ? "00" : Int32.Parse(arr_temp[1]).ToString("D2"); 
    
    string _sec = Int32.Parse(sec) == 0 ? "00" : Int32.Parse(sec).ToString("D2");
    
    string outputTime = _hour + ":" + _minute + ":" + _sec + "" + time;
    
    20.04.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..