C # की तुलना में एक पूर्णांक के लिए एक महीने के नाम (स्ट्रिंग) को पार्स कैसे करें?


92

मुझे एक सरणी में कुछ महीने के नामों की तुलना करने में सक्षम होने की आवश्यकता है।

यह अच्छा होगा यदि कुछ प्रत्यक्ष तरीके थे जैसे:

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

मेरी Google खोज का एकमात्र तरीका सुझाना प्रतीत होता है, अपनी विधि लिखने के लिए, लेकिन यह एक सामान्य पर्याप्त समस्या की तरह लगता है कि मुझे लगता है कि इसे .Net में पहले ही लागू किया जा चुका होगा, किसी ने भी यह पहले किया है?

जवाबों:


174

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

हालाँकि, आपके उद्देश्यों के लिए, आप शायद Dictionary<string, int>महीने के नाम के मानचित्रण को उसके मूल्य के लिए बनाने से बेहतर होंगे ।


11
विचार करने के लिए सुनिश्चित करें stackoverflow.com/questions/258793/... निर्णय लेते समय CultureInfo.CurrentCulture या CultureInfo.InvariantCulture उपयोग करने के लिए
Rasmus फैबर


19

यदि आप DateTime.ParseExact()-method का उपयोग करते हैं जो कि कई लोगों ने सुझाव दिया है, तो आपको ध्यान से विचार करना चाहिए कि जब आप एक गैर-अंग्रेजी वातावरण में अनुप्रयोग चलाते हैं तो आप क्या करना चाहते हैं!

में डेनमार्क, की जो ParseExact("Januar", ...)और ParseExact("January", ...)काम करना चाहिए और जो असफल चाहिए?

यही अंतर होगा CultureInfo.CurrentCultureऔर CultureInfo.InvariantCulture


10

बस एक समाधान के नाम और मूल्यों के साथ एक शब्दकोश बनाया जाएगा। फिर युक्तियों () का उपयोग करके आप सही मूल्य पा सकते हैं।

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 ऑब्जेक्ट प्राप्त करने के लिए DateTime.Parse विधि का उपयोग कर सकते हैं और फिर उसकी महीना संपत्ति की जांच कर सकते हैं। कुछ इस तरह से करें:

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

डेटटाइम ऑब्जेक्ट बनाने के लिए मान्य दिनांक बनाने के लिए ट्रिक है।


9

आप कई महीनों का उपयोग कर सकते हैं:

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

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

मैं enum.Parse () के लिए वाक्यविन्यास पर 100% निश्चित नहीं हूं, हालांकि।


1
इसे "सार्वजनिक महीना टॉयंट (स्ट्रिंग इनपुट) {...}" होना चाहिए, लेकिन अन्यथा यह सही है।
जेम्स क्यूरन

1
मुझे पता है कि यह एक पुरानी टिप्पणी है, लेकिन मैंने सोचा है कि आपको 1 से अपनी एनम शुरू करनी चाहिए, उदाहरण के लिए public enum Month { January = 1, Feburary }और मंथ के बजाय एक इंट में भी डालना चाहिए।
eth0

@ eth0: उफ़ ... आप सही कह रहे हैं। इसे ठीक किया, इसे इंगित करने के लिए धन्यवाद ;-)
ट्रेब नोव

7

ऐसा करने के लिए आपको डेटटाइम इंस्टेंस नहीं बनाना होगा। यह इस तरह सरल है:

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

मैं इसे एक अधिभार बनाने के लिए एक अभ्यास के रूप में छोड़ दूँगा जहाँ आप एक स्पष्ट कल्चरइन्फो में पास कर सकते हैं।


का अच्छा उपयोग ToLower()- मुझे नहीं पता था कि ओवरलोड में से एक स्ट्रिंग को धर्मान्तरित करता है, using the casing rules of the specified cultureहालांकि यह उचित है कि यह उस विधि नाम से स्पष्ट नहीं है कि यह उस कार्यक्षमता को वहन कर सकता है।
डेविड क्लार्क

1
ठीक है, इसलिए मैं LINQPad का उपयोग करके यह परीक्षण कर रहा हूं और मैं इसे अपने काम में नहीं ला सकता CurrentCulture। दोनों "January".ToLower(CultureInfo.CurrentCulture).Dump();और "January".ToLower(new CultureInfo("en-NZ")).Dump();आउटपुट januaryलेकिन महीने के नाम में पूंजीकृत हैं CurrentCulture.DateTimeFormat.MonthNames
डेविड क्लार्क

1
@DavidClarke खैर, हाँ, आप एक फ़ंक्शन कह रहे हैंToLower :), दरअसल, मेरे कोड में थोड़ी तार्किक खराबी है, क्योंकि दा-डीके में सभी निचले मामलों को महीने के नाम दिए गए हैं । इसलिए, या तो किसी को इनपुट के मामले में कम नहीं करना चाहिए, या किसी को महीने के सभी नामों के मामले में भी कम करना चाहिए - यह निर्भर करता है कि केस-असंवेदनशील मैच वांछित है या नहीं।
मार्क सेमैन

1
हां, मैं प्रलेखन की व्याख्या कर रहा था using the casing rules of the specified cultureइसका मतलब है कि यह उदाहरण के लिए महीनों और दिनों के हिसाब से बड़ा होगा CultureInfo। जो आपके उदाहरण में काम करता है क्योंकि महीने के नाम कम मामले हैं। गुमराह करने के लिए यूनिट परीक्षणों का उपयोग करने का प्रभावी प्रदर्शन। यह स्पष्ट करने के लिए एक संपादन के योग्य हो सकता है कि आपका उदाहरण एक किनारे का मामला है :-)
डेविड क्लार्क

2

और इस सवाल का जवाब देने के सात साल बाद, यह संभव है कि बिल्ट-इन तरीकों का उपयोग करके इस तुलना को किया जाए:

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 स्ट्रिंग तुलना का उपयोग करके एक बेहतर समाधान है। यह ओपी के प्रश्न के लिए ठीक काम करता है, हालाँकि यदि आप DateTime.Month द्वारा लौटाए गए समान मान में परिवर्तित करने के लिए इस पद्धति का उपयोग करना चाहते हैं, तो मैं परिणाम में +1 जोड़ने का सुझाव दूंगा। ओपी की तुलना की आवश्यकता अभी भी संतुष्ट है या पाठ्यक्रम है।
इंजाजा

1

यदि आप c # 3.0 (या ऊपर) का उपयोग कर रहे हैं तो आप extenders का उपयोग कर सकते हैं


फिर हाँ, दुर्भाग्य से मुझे लगता है कि आपकी खुद की विधि सबसे सुरुचिपूर्ण समाधान होगी।
एडम नाइलर

@AdamNaylor: एक्सटेंडर क्या है? क्या आप एक उदाहरण के साथ अपना उत्तर बता सकते हैं?
अमीर

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

सावधानी कोड बीटा संस्करण में है।


स्वीकृत उत्तर ज्यादा बेहतर है।
जेम्स ए मोह्लर

1

मैं इसे स्पेनिश संस्करण में सी # कोड में अनुवाद करता हूं, का संबंध है:

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;

मुझे उम्मीद है इससे आपको मदद मिली होगी!!!

धन्यवाद!!!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.