2014-10-22 1 views
3

Я создал простой калькулятор возраста. Я хочу удалить десятичные разряды, но проблема заключается в том, что я выхожу из now в bday.Простая Возрастная калькуляция базы на дату рождения в C#

пример: I вход 2012, 10 и 23 и дата теперь 2014-10-22, Так что, когда 2014.1022 - 2012.1023 результат будет 1.9999... я хочу, чтобы удалить все десятичные места и по-прежнему целое число 1, но время я использую String.Format("{0:00}" Он округляет результат до 02, даже когда я использую ConvertToInt32, я не хочу использовать split string, ему нужно много кода.

Любые идеи?

static void Main(string[] args) 
     { 
      string year, month, day = string.Empty; 
      Console.WriteLine("Enter your Birthdate:"); 
      Console.WriteLine("Year :"); 
      year = Console.ReadLine(); 
      Console.WriteLine("Month :"); 
      month = Console.ReadLine(); 
      Console.WriteLine("Day :"); 
      day = Console.ReadLine(); 
      try 
      { 
       DateTime date = Convert.ToDateTime(year + "-" + month + "-" + day); 
       var bday = float.Parse(date.ToString("yyyy.MMdd")); 
       var now = float.Parse(DateTime.Now.ToString("yyyy.MMdd")); 
       if (now < bday) 
       { 
        Console.WriteLine("Invalid Input of date"); 
        Console.ReadLine(); 

       } 
       Console.WriteLine("Your Age is " + (String.Format("{0:00}", (now - bday)))); //it rounds off my float 
       Console.ReadLine(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
       Console.ReadLine(); 
      } 

     } 

}

+1

Почему вы не используете класс TimeSpan? –

+0

1. вы можете использовать 'TimeSpan'. 2. Посмотрите на этот ответ http: // stackoverflow.com/questions/16671165/how-to-calculate-the-age-of-person, чтобы получить представление о том, как рассчитать дату самостоятельно – AsfK

+1

@ JennyO'Reilly: вы не можете получить от TimeSpan до нескольких лет ... –

ответ

-1

Here Я нашел ответ на мой вопрос, я использую LastIndexOf, чтобы удалить все строки после определенного символа, который является точкой, но до того, что Я преобразовал float в string.

Это точно, попробуйте. :)

static void Main(string[] args) 
    { 
     string year, month, day = string.Empty; 
     Console.WriteLine("Enter your Birthdate:"); 
     Console.WriteLine("Year :"); 
     year = Console.ReadLine(); 
     Console.WriteLine("Month :"); 
     month = Console.ReadLine(); 
     Console.WriteLine("Day :"); 
     day = Console.ReadLine(); 
     try 
     { 
      DateTime date = Convert.ToDateTime(year + "-" + month + "-" + day); 
      var bday = float.Parse(date.ToString("yyyy.MMdd")); 
      var now = float.Parse(DateTime.Now.ToString("yyyy.MMdd")); 
      if (now < bday) 
      { 
       Console.WriteLine("Invalid Input of date"); 
       Console.ReadLine(); 

      } 
      string age = (now - bday).ToString(); 
      Console.WriteLine("Your Age is " + (age.Substring(0, age.LastIndexOf('.')))); 
      Console.ReadLine(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
      Console.ReadLine(); 
     } 





     } 
+0

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

+0

@ JennyO'Reilly, о чем вы говорите в мире. Тем не менее, я не получил никакого ответа на их ответ. и я пытаюсь решить это сам. – Awtszs

+0

Решение, которое вы разместили самостоятельно, было уже предложено мной (используя Math.Floor) и Jon Skeet (отличное от целого), используя более простой способ. Поэтому ваше решение не имеет для меня никакого смысла. Каким образом ваше решение отличается? –

9

В отличие от комментариев, TimeSpan делает не помочь вам здесь, потому что год не является фиксированной длины времени. Это, в свою очередь, приводит к тому, что ваша выраженная цель очень странная. Вы действительно не должны представлять дату как дробное число, причем первые две цифры составляют месяцы, а третья и четвертая цифры - дни. Время просто не работает. (Рассмотрим, что разница между 2014.0131 и 2014.0201 намного больше, чем разница между 2014.0130 и 2014.0131, например.)

Было бы лучше представлять возраст по годам, месяцам и дням. Моя Noda Time библиотека делает это довольно просто:

LocalDate birthday = new LocalDate(1976, 6, 19); // For example 
LocalDate today = LocalDateTime.FromDateTime(DateTime.Now).Date; // See below 
Period period = Period.Between(birthday, today); 
Console.WriteLine("You are {0} years, {1} months, {2} days old", 
        period.Years, period.Months, period.Days); 

Если вы хотите просто определить количество лет, вы могли бы решить просто использовать period.Years, или, возможно, вокруг результата на основе period.Months а.

Я бы рекомендовал не использовать DateTime.Now в производстве код, однако. В Noda Time у нас есть интерфейс IClock, представляющий «средство получения текущего момента времени» с реализацией SystemClock в основной сборке и реализацию FakeClock в тестовой сборке. Ваш код будет принимать IClock (возможно, с использованием зависимостей), а затем использовать его для определения текущей даты в любом часовом поясе, в котором вы заинтересованы. Таким образом, вы можете писать тесты для любой ситуации, которая вам нравится, без изменения часов вашего компьютера. Это хороший способ справиться с задачами, связанными с временем, в целом, ИМО.

2

В наших рамках мы используем следующие методы: (.) ​​

/// <summary> 
    /// Calculates the age at the specified date. 
    /// </summary> 
    /// <param name="dateOfBirth">The date of birth.</param> 
    /// <param name="referenceDate">The date for which the age should be calculated.</param> 
    /// <returns></returns> 
    public static int Age(DateTime dateOfBirth, DateTime referenceDate) 
    { 
     int years = referenceDate.Year - dateOfBirth.Year; 
     dateOfBirth = dateOfBirth.AddYears(years); 
     if (dateOfBirth.Date > referenceDate.Date) 
      years--; 
     return years; 
    } 

    /// <summary> 
    /// Calculates the age at this moment. 
    /// </summary> 
    /// <param name="dateOfBirth">The date of birth.</param> 
    /// <returns></returns> 
    public static int Age(DateTime dateOfBirth) 
    { 
     return Age(dateOfBirth, DateTime.Today); 
    } 
Смежные вопросы