সি # এর সাথে তুলনা করার জন্য কোনও পূর্ণসংখ্যার সাথে মাসের নাম (স্ট্রিং) কীভাবে পার্স করবেন?


94

অ্যারেতে থাকা আমার কয়েক মাসের নামের তুলনা করতে সক্ষম হতে হবে।

এটির মতো সরাসরি কিছু উপায় থাকলে ভাল হবে:

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

আমার গুগল অনুসন্ধানে নিজের পদ্ধতি লিখার একমাত্র উপায় বলে মনে হচ্ছে, তবে এটি একটি সাধারণ যথেষ্ট সমস্যা বলে মনে হচ্ছে যা আমি মনে করি এটি ইতিমধ্যে বাস্তবায়িত হত N নেট, আগে কেউ এই কাজটি করেছে?

উত্তর:


176

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

যদিও, আপনার উদ্দেশ্যে, আপনি সম্ভবত Dictionary<string, int>মাসের নামটির মান হিসাবে মানচিত্র তৈরি করা থেকে ভাল better


11
কালচারিআইনফো.কন্ট্রাল কালচার বা কালচারিআইনফোর.আইভিনিয়ার্টকালচার ব্যবহার করবেন কিনা তা সিদ্ধান্ত নেওয়ার সময় স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি
রাসমাস ফ্যাবার


19

আপনি যদি DateTime.ParseExact()বেশ কয়েকটি লোকের পরামর্শ অনুসারে আদর্শটি ব্যবহার করেন তবে অ্যাপ্লিকেশনটি অ-ইংরেজী পরিবেশে চালিত হওয়ার পরে আপনি কী হতে চান তা যত্ন সহকারে বিবেচনা করা উচিত!

ইন ডেনমার্ক, যা 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

ডেটটাইম অবজেক্ট পেতে আপনি ডেটটাইম.পার্স পদ্ধতিটি ব্যবহার করতে পারেন এবং তার মাসের সম্পত্তিটি পরীক্ষা করতে পারেন। এরকম কিছু করুন:

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

এনামের জন্য সিনট্যাক্সে আমি 100% নির্দিষ্ট নই। পার্স (), যদিও।


4
এটি "সার্বজনীন মাস ToInt (স্ট্রিং ইনপুট) {...}" হওয়া দরকার তবে অন্যথায় এটি সঠিক।
জেমস কারান

4
আমি জানি এটি একটি পুরানো মন্তব্য তবে আমি ভেবেছিলাম যে আপনি আপনার এনামটি 1 থেকে শুরু করুন, উদাহরণস্বরূপ public enum Month { January = 1, Feburary }এবং এটি মাসের পরিবর্তে কোনও int এও দেওয়া উচিত ।
eth0

@ এথ0: ওফ ... ঠিক বলেছেন এটি সংশোধন করা হয়েছে; এটি
দেখানোর

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যদিও ন্যায্য হলেও এটি পদ্ধতিটির নাম থেকে স্পষ্ট নয় যে এটি সেই কার্যকারিতাটি বহন করতে পারে।
ডেভিড ক্লার্ক

4
ঠিক আছে, তাই আমি লিনকুইপ্যাড ব্যবহার করে এটি পরীক্ষা করেছি এবং আমি এটি আমার কাজ করতে পারি না CurrentCulture। উভয় "January".ToLower(CultureInfo.CurrentCulture).Dump();এবং "January".ToLower(new CultureInfo("en-NZ")).Dump();আউটপুট januaryকিন্তু মাসের নামগুলি বড় আকারে CurrentCulture.DateTimeFormat.MonthNames
ডেভিড ক্লার্ক

4
@DavidClarke ওয়েল, হ্যাঁ, আপনি হয় একটি ফাংশন বলা কলিং ToLower:) আসলে, সেখানে আমার কোড সামান্য লজিক্যাল খুঁত আছে, যেহেতু মাস নাম হয় দা-ডিকে সমস্ত ছোট হাতের হিসেবে দেওয়া। সুতরাং, হয় একটি ইনপুট ছোট করা উচিত নয়, বা অন্যথায় সমস্ত মাসের নামগুলিও ছোট করা উচিত - কেস-সংবেদনশীল মিলটি পছন্দ হয় কিনা তার উপর নির্ভর করে।
সিমমান

4
হ্যাঁ আমি ডকুমেন্টেশনের ব্যাখ্যা 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))

যা সরলতার জন্য একটি এক্সটেনশন পদ্ধতিতে রিফ্যাক্টর করা যেতে পারে। নিম্নলিখিতটি একটি লিনকিপ্যাড উদাহরণ (অতএব 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 স্ট্রিং তুলনা ব্যবহার করে আরও ভাল সমাধান। এটি ওপি-র প্রশ্নের পক্ষে সূক্ষ্মভাবে কাজ করে, তবে আপনি যদি ডেটটাইম.মুন্থ দ্বারা ফিরিয়ে দেওয়া একই মানকে রূপান্তর করার জন্য এই পদ্ধতিটি ব্যবহার করতে চান তবে আমি ফলাফলটিতে +1 যোগ করার পরামর্শ দেব। ওপি'র তুলনার প্রয়োজনীয়তা এখনও সন্তুষ্ট বা কোর্স।
আইজিঞ্জা

1

আপনি যদি সি # 3.0 (বা উপরে) ব্যবহার করেন তবে আপনি এক্সটেন্ডার ব্যবহার করতে পারেন


তাহলে হ্যাঁ, দুর্ভাগ্যজনকভাবে আমি মনে করি আপনার নিজস্ব পদ্ধতিটি সবচেয়ে মার্জিত সমাধান হবে।
অ্যাডাম নায়লর

4
@ অ্যাডামনায়েলর: এক্সটেন্ডার কি? আপনি একটি উদাহরণ দিয়ে আপনার উত্তর ব্যাখ্যা করতে পারেন?
আমির

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

আমি যা করেছি তা হল বিন্যাসের স্ট্রিং তৈরি করতে সিম্পলডিটফর্ম্যাট ব্যবহার করা এবং একটি তারিখের পাঠ্যকে পার্স করা এবং তারপরে মাসটি পুনরুদ্ধার করা। কোডটি নীচে রয়েছে:

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;

আমি এটি আপনাকে সাহায্য করে আশা করি!!!

ধন্যবাদ !!!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.