2008-11-03 15 views
84

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

यह अच्छा होगा यदि वहाँ कुछ सीधा रास्ता की तरह थे होगा:

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

मेरा गूगल खोज का सुझाव देने के लिए एक ही रास्ता अपनी खुद की विधि लिखना है लगता है, लेकिन यह एक काफी आम समस्या की तरह लगता है कि मैं करूंगा लगता है कि यह पहले से ही लागू हो चुका था। नेट, किसी ने पहले यह किया था?

उत्तर

142

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

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

+11

यह तय करते समय http://stackoverflow.com/questions/258793/how-to-parse-a-month-name-string-to-an-integer-for-comparison-in-c#258895 पर विचार करना सुनिश्चित करें कि क्या CultureInfo.CurrentCulture या CultureInfo.InvariantCulture –

1

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

+0

मैं .net उपयोग कर रहा हूँ 2.0 – spilliton

+0

तो हां, दुर्भाग्य से मुझे लगता है कि अपनी खुद की तरीका होगा सबसे सुरुचिपूर्ण समाधान। –

18

आप कुछ इस तरह कर सकता है:

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

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

, हालांकि मैं enum.Parse() के लिए वाक्य रचना पर 100% कुछ नहीं कर रहा हूँ:

7

आप महीने की एक enum का उपयोग कर सकते हैं।

+1

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

+1

मुझे पता है कि यह एक पुरानी टिप्पणी है लेकिन मैंने सोचा कि मैं बताऊंगा कि आपको अपना enum 1 से शुरू करना चाहिए, उदा। 'सार्वजनिक enum महीना {जनवरी = 1, फरवरी}' और महीने के बजाय एक int में भी डाला। – eth0

+0

@ eth0: ओह ... आप सही हैं। इसे ठीक किया गया, इसे इंगित करने के लिए धन्यवाद ;-) – Treb

18

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

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

CultureInfo.CurrentCulture और CultureInfo.InvariantCulture के बीच यह अंतर होगा।

0
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

स्वीकृत उत्तर बहुत बेहतर है। –

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(); 
+1

यह कोड सी # नहीं है। यह जावा है। – Indian

5

आपको ऐसा करने के लिए डेटटाइम उदाहरण बनाने की आवश्यकता नहीं है। यह इस रूप में सरल है:

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 में पास कर सकते हैं।

+0

'toLower()' का अच्छा उपयोग - मुझे पता नहीं था कि ओवरलोड में से एक निर्दिष्ट स्ट्रिंग के आवरण नियमों का उपयोग करते हुए स्ट्रिंग को परिवर्तित करता है, हालांकि उचित होने के लिए यह विधि नाम से स्पष्ट नहीं है कि यह उस कार्यक्षमता को बर्दाश्त कर सकता है। –

+0

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

+1

@ डेविड क्लार्क ठीक है, हाँ, आप * 'ToLower' नामक फ़ंक्शन को कॉल कर रहे हैं :) दरअसल, मेरे कोड में मामूली तार्किक दोष है, क्योंकि महीने के नाम * को डी-डीके में सभी निचले मामले के रूप में दिया जाता है। इसलिए, किसी को भी इनपुट के मामले को कम नहीं करना चाहिए, या फिर किसी को भी सभी महीने के नामों को कम करना चाहिए - इस पर निर्भर करता है कि केस-असंवेदनशील मैच वांछित है या नहीं। –

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

     } 

    } 
5

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

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

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

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 
संबंधित मुद्दे

 संबंधित मुद्दे