답변:
한 가지 간단한 해결책은 이름과 값이있는 사전을 만드는 것입니다. 그런 다음 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;
}
}
달의 열거 형을 사용할 수 있습니다.
public enum Month
{
January,
February,
// (...)
December,
}
public Month ToInt(Month Input)
{
return (int)Enum.Parse(typeof(Month), Input, true));
}
하지만 enum.Parse () 구문에 대해 100 % 확신하지는 않습니다.
public enum Month { January = 1, Feburary }
하고 Month 대신 int로 캐스팅 해야한다고 지적했습니다 .
이를 위해 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
못했지만 그 기능을 감당할 수 있다는 것이 메서드 이름에서 분명하지 않습니다.
CurrentCulture
. "January".ToLower(CultureInfo.CurrentCulture).Dump();
및 "January".ToLower(new CultureInfo("en-NZ")).Dump();
출력을 january
제외한 월 이름은 모두 CurrentCulture.DateTimeFormat.MonthNames
.
ToLower
:) 사실, 달 이름 은 da-DK에서 모두 소문자로 주어 지기 때문에 내 코드에 약간의 논리적 결함이 있습니다. 따라서 대소 문자를 구분하지 않는 일치를 원하는지 여부에 따라 입력을 소문자로 지정하지 않거나 월 이름을 모두 소문자로 지정해야합니다.
using the casing rules of the specified culture
를 해석 하여 CultureInfo
. 월 이름이 소문자이기 때문에 귀하의 예에서 작동합니다. 단위 테스트를 사용하여 오도하는 효과적인 데모. 편집의 가치가 될 수있는 것은 당신의 예는 에지 경우 :-) 것을 명확하게하기
질문이 제기 된 지 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
c # 3.0 (또는 그 이상)을 사용하는 경우 Extender를 사용할 수 있습니다.
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
주의 코드는 베타 버전입니다.
스페인어 버전의 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";
}
}
내가 한 일은 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();