web-dev-qa-db-ja.com

C#で比較するために月名(文字列)を整数に解析する方法は?

配列にあるいくつかの月の名前を比較できるようにする必要があります。

次のような直接的な方法があればいいですね。

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

私のGoogle検索はあなた自身のメソッドを書くことを唯一の方法を示唆しているようですが、これは。

89
spilliton

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

ただし、あなたの目的のためには、おそらく月の名前をその値にマッピングするDictionary<string, int>を作成する方が良いでしょう。

167
James Curran

次のようなことができます:

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

複数の人々が提案したDateTime.ParseExact()- methodを使用する場合、アプリケーションが英語以外の環境で実行されたときに何が起こるかを慎重に検討する必要があります。

デンマークでは、ParseExact("Januar", ...)ParseExact("January", ...)のどちらが機能し、どちらが機能しませんか?

CultureInfo.CurrentCultureCultureInfo.InvariantCultureの違いになります。

19
Rasmus Faber

DateTime.Parseメソッドを使用してDateTimeオブジェクトを取得し、そのMonthプロパティを確認できます。このようなことをしてください:

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

トリックは、有効な日付を作成してDateTimeオブジェクトを作成することです。

8
Rune Grimstad

月の列挙を使用できます。

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

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

ただし、enum.Parse()の構文については100%確実ではありません。

7
Treb

1つの簡単な解決策は、名前と値を使用して辞書を作成することです。次に、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;
    }
}
7
Carlos A. Ortiz

これを行うために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を渡すことができるオーバーロードを作成するために、読者に演習として残しておきます。

7
Mark Seemann

質問が行われてから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
_
2
David Clarke

私はそれをスペイン語版の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";

        }

   }

C#3.0(またはそれ以上)を使用している場合、エクステンダーを使用できます

1
Adam Naylor
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

注意コードはベータ版です。

0
Thabiso

私がやったのは、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
Ebenezer Ampiah