C#의 비교를 위해 월 이름 (문자열)을 정수로 구문 분석하는 방법?

StackOverflow https://stackoverflow.com/questions/258793

  •  06-07-2019
  •  | 
  •  

문제

배열에있는 달 이름을 비교할 수 있어야합니다.

다음과 같은 직접적인 방법이 있으면 좋을 것입니다.

Month.toInt("January") > Month.toInt("May")

내 Google 검색은 유일한 방법이 자신의 방법을 작성하는 것이라는 유일한 방법을 제안하는 것 같습니다. 그러나 이것은 이미 .NET에서 이미 구현되었을 것이라고 생각하는 일반적인 문제처럼 보입니다.

도움이 되었습니까?

해결책

DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month

당신의 목적을 위해, 당신은 아마도 Dictionary<string, int> 월 이름을 그 가치에 매핑합니다.

다른 팁

당신은 다음과 같은 일을 할 수 있습니다 :

Convert.ToDate(month + " 01, 1900").Month

당신이 사용하는 경우 DateTime.ParseExact()-여러 사람들이 제안한 방법으로, 영어 이외의 환경에서 응용 프로그램이 실행될 때 원하는 일을 신중하게 고려해야합니다!

덴마크에서 ParseExact("Januar", ...) 그리고 ParseExact("January", ...) 일해야하고 어느 것이 실패해야합니까?

그것은 차이가 될 것입니다 CultureInfo.CurrentCulture 그리고 CultureInfo.InvariantCulture.

DateTime.Parse 메소드를 사용하여 DateTime 객체를 얻은 다음 달의 속성을 확인할 수 있습니다. 다음과 같이하십시오 :

int month = DateTime.Parse("1." + monthName + " 2008").Month;

요령은 DateTime 객체를 만드는 유효한 날짜를 작성하는 것입니다.

열거 몇 달을 사용할 수 있습니다.

public enum Month
{
    January,
    February,
    // (...)
    December,
}    

public Month ToInt(Month Input)
{
    return (int)Enum.Parse(typeof(Month), Input, true));
}

그러나 Enum.parse ()의 구문에 대해서는 100% 확실하지 않습니다.

이 작업을 수행하기 위해 DateTime 인스턴스를 만들 필요가 없습니다. 이것만큼 간단합니다.

public static class Month
{
    public static int ToInt(this string month)
    {
        return Array.IndexOf(
            CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
            month.ToLower(CultureInfo.CurrentCulture))
            + 1;
    }
}

나는 da-DK 문화,이 단위 테스트가 통과합니다.

[Theory]
[InlineData("Januar", 1)]
[InlineData("Februar", 2)]
[InlineData("Marts", 3)]
[InlineData("April", 4)]
[InlineData("Maj", 5)]
[InlineData("Juni", 6)]
[InlineData("Juli", 7)]
[InlineData("August", 8)]
[InlineData("September", 9)]
[InlineData("Oktober", 10)]
[InlineData("November", 11)]
[InlineData("December", 12)]
public void Test(string monthName, int expected)
{
    var actual = monthName.ToInt();
    Assert.Equal(expected, actual);
}

나는 당신이 명시 적 문화를 통과 할 수있는 오버로드를 만들기 위해 독자에게 연습으로 남겨 둘 것입니다.

단순히 솔루션은 이름과 값이있는 사전을 만드는 것입니다. 그런 다음 contain ()를 사용하면 올바른 값을 찾을 수 있습니다.

Dictionary<string, string> months = new Dictionary<string, string>()
{
                { "january", "01"},
                { "february", "02"},
                { "march", "03"},
                { "april", "04"},
                { "may", "05"},
                { "june", "06"},
                { "july", "07"},
                { "august", "08"},
                { "september", "09"},
                { "october", "10"},
                { "november", "11"},
                { "december", "12"},
};
foreach (var month in months)
{
    if (StringThatContainsMonth.ToLower().Contains(month.Key))
    {
        string thisMonth = month.Value;
    }
}

그리고 질문이 제기 된 후 7 년 동안 대답하면 내장 방법을 사용 하여이 비교를 수행 할 수 있습니다.

Month.toInt("January") > Month.toInt("May")

becomes

Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                 t => t.Equals("January", StringComparison.CurrentCultureIgnoreCase)) >
Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                 t => t.Equals("May", StringComparison.CurrentCultureIgnoreCase))

단순성을 위해 확장 방법으로 리팩토링 될 수 있습니다. 다음은 linqpad 예입니다 (따라서 Dump() 방법 호출) :

void Main()
{
    ("January".GetMonthIndex() > "May".GetMonthIndex()).Dump();
    ("January".GetMonthIndex() == "january".GetMonthIndex()).Dump();
    ("January".GetMonthIndex() < "May".GetMonthIndex()).Dump();
}

public static class Extension {
    public static int GetMonthIndex(this string month) {
        return Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                         t => t.Equals(month, StringComparison.CurrentCultureIgnoreCase));
    }
}

출력 :

False
True
True

C# 3.0 (또는 위)을 사용하는 경우 Extenders를 사용할 수 있습니다.

스페인어 버전의 C# 코드로 번역합니다.

public string ObtenerNumeroMes(string NombreMes){

       string NumeroMes;   

       switch(NombreMes) {

        case ("ENERO") :
            NumeroMes = "01";
            return NumeroMes;

        case ("FEBRERO") :
            NumeroMes = "02";
            return NumeroMes;

        case ("MARZO") :
            NumeroMes = "03";
            return NumeroMes;

        case ("ABRIL") :
            NumeroMes = "04";
            return NumeroMes;

        case ("MAYO") :
            NumeroMes = "05";
            return NumeroMes;

        case ("JUNIO") :
            NumeroMes = "06";
            return NumeroMes;

        case ("JULIO") :
            NumeroMes = "07";
            return NumeroMes;

        case ("AGOSTO") :
            NumeroMes = "08";
            return NumeroMes;

        case ("SEPTIEMBRE") :
            NumeroMes = "09";
            return NumeroMes;

        case ("OCTUBRE") :
            NumeroMes = "10";
            return NumeroMes;

        case ("NOVIEMBRE") :
            NumeroMes = "11";
            return NumeroMes;

        case ("DICIEMBRE") :
            NumeroMes = "12";
            return NumeroMes;

            default:
            Console.WriteLine("Error");
            return "ERROR";

        }

   }
Public Function returnMonthNumber(ByVal monthName As String) As Integer
    Select Case monthName.ToLower
        Case Is = "january"
            Return 1
        Case Is = "february"
            Return 2
        Case Is = "march"
            Return 3
        Case Is = "april"
            Return 4
        Case Is = "may"
            Return 5
        Case Is = "june"
            Return 6
        Case Is = "july"
            Return 7
        Case Is = "august"
            Return 8
        Case Is = "september"
            Return 9
        Case Is = "october"
            Return 10
        Case Is = "november"
            Return 11
        Case Is = "december"
            Return 12
        Case Else
            Return 0
    End Select
End Function

주의 코드는 베타 버전입니다.

내가 한 일은 SimpledateFormat을 사용하여 형식 문자열을 만들고 텍스트를 날짜로 구문 분석 한 다음 그 월을 검색하는 것이 었습니다. 코드는 다음과 같습니다.

int year = 2012 \\or any other year
String monthName = "January" \\or any other month
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy");
int monthNumber = format.parse("01-" + monthName + "-" + year).getMonth();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top