كيفية تحليل اسم الشهر (سلسلة) إلى عدد صحيح للمقارنة في C #؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأحتاج إلى أن أكون قادرا على مقارنة بعض الأسماء الشهر لدي في صفيف.

وسيكون من الجميل لو كانت هناك طريقة مباشرة مثل:

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

وبلدي جوجل البحث يشير فيما يبدو الى الطريقة الوحيدة هي كتابة أسلوب خاص بك، ولكن هذا يبدو وكأنه مشكلة شائعة يكفي أنني أعتقد أنه سيكون قد تم تنفيذها بالفعل في صافي، فعلت كل هذا من قبل؟

هل كانت مفيدة؟

المحلول

و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 للحصول على وجوه التاريخ والوقت ومن ثم تحقق خاصية شهر لها. تفعل شيئا مثل هذا:

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

وهو خدعة لبناء تاريخا صالحا لإنشاء كائن التاريخ والوقت.

ويمكنك استخدام التعداد أشهر:

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

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

وأنا لست 100٪ على يقين في بناء الجملة من أجل enum.Parse ()، وإن كان.

وليس لديك لإنشاء مثيل التاريخ والوقت للقيام بذلك. انها بسيطة مثل هذا:

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 صريح.

واحد ببساطة الحل سيكون إنشاء قاموس مع أسماء والقيم. ثم استخدام يحتوي على () يمكنك العثور على القيمة الصحيحة.

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

والإجابة عن هذا سبع سنوات بعد أن تم طرح السؤال، فمن الممكن القيام بذلك مقارنة باستخدام أساليب المدمج في:

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

إذا كنت تستخدم ج # 3.0 (أو أعلى) يمكنك استخدام تمديدات

وأنا ترجمتها إلى 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