Перевод формулы MS Excel в C# - PullRequest
1 голос
/ 18 июня 2020

РЕДАКТИРОВАТЬ

Просто проверьте, что ответил @Sam Axe:

using System;

public class Program
{
    public static void Main()
    {
        double a = (new DateTime(2020, 9, 30) - new DateTime(1900, 1, 1)).TotalDays;
        double b = (new DateTime(1994, 7, 31) - new DateTime(1900, 1, 1)).TotalDays;

        Console.WriteLine(( a - 0.8 * b ) / 365.25) ; // 45.08!
    }
}

ORIGINAL

У меня есть эта формула MS Excel:

=(AI14 - 80% * MAX(EOMONTH($J$12;12*18),"31/07/1994")) / 365.25

Где AI14 - последний день месяца дня рождения человека в текущем году; EOMONTH ($ J $ 12; 12 * 18) - последний день месяца дня рождения, когда человеку исполнилось 18 лет.

Я создал метод EOMONTH в stati c C# class:

public static class Helper
{
    public static DateTime EOMonth(DateTime someDate)
    {
        return new DateTime(someDate.Year, someDate.Month, DateTime.DaysInMonth(someDate.Year, someDate.Month));
    }

    // Calculate age
    public static int CalculateAge(DateTime dateOfBirth, DateTime refDate)
    {
        return (int)((refDate - dateOfBirth).TotalDays / 365.25);
    }
}

Затем я использую Helper.EOMonth((dateOfBirth).AddYears(age)), чтобы получить тот же результат от AI14 в MS Excel.

Чтобы получить результат от MAX(EOMONTH($J$12;12*18),"31/07/1994"), я делаю следующее:

FIDDLE

using System;

public class Program
{
    public static void Main()
    {
        DateTime dateOfBirth = new DateTime(1961, 9, 3);
        byte age = (byte)Helper.CalculateAge(dateOfBirth, DateTime.Now);
        DateTime lastDayBirthdayMonthCurrentYear = Helper.EOMonth((dateOfBirth).AddYears(age));

        DateTime dateWhenThePersonWas18 = Helper.EOMonth((dateOfBirth).AddYears(18));
        DateTime referenceDate = new DateTime(1994, 7, 31);

        DateTime maxDate = new DateTime(Math.Max(referenceDate.Ticks, dateWhenThePersonWas18.Ticks));

        Console.WriteLine(lastDayBirthdayMonthCurrentYear);

        Console.WriteLine(dateWhenThePersonWas18);

        Console.WriteLine(maxDate);

        // Putting all together
        // It gives an error because I cannot apply '*' to DateTime and double
        // double factor = (lastDayBirthdayMonthCurrentYear  - 0.8 * maxDate ) / 365.25;

    }

}


public static class Helper
{
    public static DateTime EOMonth(DateTime data)
    {
        return new DateTime(data.Year, data.Month, DateTime.DaysInMonth(data.Year, data.Month)); ;
    }

    // Calculate age
    public static int CalculateAge(DateTime dateOfBirth, DateTime refDate)
    {
        return (int)((refDate - dateOfBirth).TotalDays / 365.25);
    }
}

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

Для этого примера ( та же дата рождения) коэффициент, рассчитанный MS Excel, равен 45,08, но я даже не знаю, правильно ли это, потому что я никогда не сталкивался с такой ситуацией, когда человеку нужно было рассчитать процент от даты. Что это вообще значит?

1 Ответ

2 голосов
/ 18 июня 2020

Вам нужно это проверить ... Я просто бегаю по памяти и быстро ищу в Google ..

Но Excel сохраняет даты в виде целого числа, представляющего количество дней с полуночи 1 января 1900 года плюс десятичное число часть 24-часового дня, представляющая время. Таким образом, 2,5 будет представлять 3 января 1900 года в полдень.

Таким образом, вы можете легко вычислить, какие 80% будут. Хотя зачем кому-то это нужно, я совершенно не понимаю за те 3 секунды, которые я потратил на эти вопросы.

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