C #에서 비교하기 위해 월 이름 (문자열)을 정수로 구문 분석하는 방법은 무엇입니까?


92

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

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

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

내 Google 검색이 유일한 방법은 자신의 방법을 작성하는 것 같지만 이것은 이미 .Net에서 구현되었을 것이라고 생각할 정도로 일반적인 문제처럼 보입니다.

답변:



20

다음과 같이 할 수 있습니다.

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

19

사용하는 경우 DateTime.ParseExact()여러 사람이 제안한 -method 응용 프로그램이 영어가 아닌 환경에서 실행될 때 수행 할 작업을 신중하게 고려해야합니다!

덴마크의에서 ParseExact("Januar", ...)ParseExact("January", ...) 작업을해야하고 어떤 실패 하는가?

그 차이 것 CultureInfo.CurrentCultureCultureInfo.InvariantCulture.


10

한 가지 간단한 해결책은 이름과 값이있는 사전을 만드는 것입니다. 그런 다음 Contains ()를 사용하여 올바른 값을 찾을 수 있습니다.

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;
    }
}

9

DateTime.Parse 메서드를 사용하여 DateTime 개체를 가져온 다음 해당 Month 속성을 확인할 수 있습니다. 다음과 같이하십시오.

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

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


9

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

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

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

하지만 enum.Parse () 구문에 대해 100 % 확신하지는 않습니다.


1
"public Month ToInt (string Input) {...}"이되어야하지만 그렇지 않으면 정확합니다.
James Curran

1
나는 이것이 오래된 주석이라는 것을 알고 있지만 열거 형을 1에서 시작 public enum Month { January = 1, Feburary }하고 Month 대신 int로 캐스팅 해야한다고 지적했습니다 .
eth0

@ eth0 : 죄송합니다 ... 당신 말이 맞아요. 수정했습니다. 지적 해 주셔서 감사합니다. ;-)
Treb 2011

7

이를 위해 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);
}

독자가 명시적인 CultureInfo를 전달할 수있는 오버로드를 만드는 연습으로 남겨 두겠습니다.


좋은 사용법 ToLower()-나는 오버로드 중 하나가 문자열을 변환한다는 것을 알지 using the casing rules of the specified culture못했지만 그 기능을 감당할 수 있다는 것이 메서드 이름에서 분명하지 않습니다.
David Clarke

1
좋아, 그래서 나는 LINQPad를 사용하여 이것을 테스트했고 내 CurrentCulture. "January".ToLower(CultureInfo.CurrentCulture).Dump();"January".ToLower(new CultureInfo("en-NZ")).Dump();출력을 january제외한 월 이름은 모두 CurrentCulture.DateTimeFormat.MonthNames.
David Clarke

1
@DavidClarke 글쎄, 네, 당신 함수를 호출하고 있습니다 ToLower:) 사실, 달 이름 da-DK에서 모두 소문자로 주어 지기 때문에 내 코드에 약간의 논리적 결함이 있습니다. 따라서 대소 문자를 구분하지 않는 일치를 원하는지 여부에 따라 입력을 소문자로 지정하지 않거나 월 이름을 모두 소문자로 지정해야합니다.
마크 시만

1
예, 문서 using the casing rules of the specified culture를 해석 하여 CultureInfo. 월 이름이 소문자이기 때문에 귀하의 예에서 작동합니다. 단위 테스트를 사용하여 오도하는 효과적인 데모. 편집의 가치가 될 수있는 것은 당신의 예는 에지 경우 :-) 것을 명확하게하기
데이비드 클라크

2

질문이 제기 된 지 7 년이 지난 후이 질문에 답하면 기본 제공 방법을 사용하여이 비교를 수행 할 수 있습니다.

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

된다

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

IgnoreCase 문자열 비교를 사용하는 훨씬 더 나은 솔루션입니다. 이것은 OP의 질문에 잘 작동하지만 DateTime.Month에서 반환 된 동일한 값으로 변환하는 데이 방법을 사용하려면 결과에 +1을 추가하는 것이 좋습니다. OP의 비교 요구 사항은 여전히 ​​만족 스럽거나 당연합니다.
iGanja

1

c # 3.0 (또는 그 이상)을 사용하는 경우 Extender를 사용할 수 있습니다.


그렇다면 불행히도 당신 자신의 방법이 가장 우아한 해결책이 될 것이라고 생각합니다.
Adam Naylor

@AdamNaylor : 익스텐더 란 무엇입니까? 예를 들어 답변을 설명해 주시겠습니까?
Amir

1
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

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


받아 들여진 대답이 훨씬 낫습니다.
James A Mohler

1

스페인어 버전의 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";

        }

   }

0

내가 한 일은 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();

0

이 코드는 다음을 도와줍니다.

using System.Globalization;

....

string FullMonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.UtcNow.Month);

GetMonthName 메서드-문자열을 반환합니다.

한 달을 정수로 얻으려면 다음을 사용하십시오.

DateTime dt= DateTime.UtcNow;
int month= dt.Month;

도움이 되었으면합니다 !!!

감사!!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.