সি # তে অর্ডিনালগুলি তৈরি করার কোন সহজ উপায় আছে?


202

কোনও সংখ্যার জন্য অর্ডিনাল তৈরির জন্য কি সি # তে সহজ উপায় আছে ? উদাহরণ স্বরূপ:

  • 1 রিটার্ন 1 ম
  • 2 রিটার্ন 2 য়
  • 3 রিটার্ন 3 য়
  • ... ইত্যাদি

এটি কি এর মাধ্যমে করা যায় String.Format()বা এটি করার জন্য কোনও কার্যকারিতা পাওয়া যায়?

উত্তর:


310

এই পৃষ্ঠাটি আপনাকে সমস্ত কাস্টম সংখ্যাসূচক বিন্যাসের সম্পূর্ণ তালিকা দেয়:

http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

যেমন আপনি দেখতে পাচ্ছেন, অর্ডিনালগুলি সম্পর্কে সেখানে কিছুই নেই, তাই স্ট্রিং.ফোর্মেট ব্যবহার করে এটি করা যায় না। তবে এটি করতে কোনও ফাংশন লিখতে এটি এতটা কঠিন নয়।

public static string AddOrdinal(int num)
{
    if( num <= 0 ) return num.ToString();

    switch(num % 100)
    {
        case 11:
        case 12:
        case 13:
            return num + "th";
    }

    switch(num % 10)
    {
        case 1:
            return num + "st";
        case 2:
            return num + "nd";
        case 3:
            return num + "rd";
        default:
            return num + "th";
    }
}

আপডেট: প্রযুক্তিগতভাবে অর্ডিনালগুলি <= 0 এর জন্য বিদ্যমান না, তাই আমি উপরের কোডটি আপডেট করেছি। অপ্রয়োজনীয় অপসারণওToString() পদ্ধতিগুলিও ।

আরও লক্ষ করুন, এটি আন্তর্জাতিকীকৃত নয়। অন্যান্য ভাষায় অধ্যাদেশগুলি দেখতে কেমন তা আমার কোনও ধারণা নেই।


2
Assert.AreEqual ("0", অ্যাডঅর্ডিনাল (0)); জ্ঞানীজ.com
কি-

2
একটি এক্সটেনশন পদ্ধতি ব্যবহার করে (বা এটি যাকেই ডাকা হয় - দেখুন @ স্টু এর উত্তর দেখুন) এখানে দুর্দান্ত কাজ করবে। @ এসআই, যদি প্রয়োজন হয় তবে এই শর্তটি যুক্ত করা খুব সহজ হবে।
স্ট্রাগার

12
'11, 12 তম' সম্পর্কে ভুলে গেছেন ... একটি সাক্ষাত্কারের প্রশ্ন হওয়া উচিত। :-)
হোল্ফ

2
হ্যাঁ, ভাল প্রোগ্রামারগুলি অদ্ভুত;)
সামজডসন

2
@ ইয়ানবারবার্টন কেবলমাত্র একক রিটার্নের বিবৃতিতে আঘাত হানার কারণে কোনও অতিরিক্ত কাজ হবে না। আপনি যদি উত্তরের সাথে সন্তুষ্ট না হন তবে দয়া করে আপনার নিজের সরবরাহ করুন, এটি করার "যথাযথ" উপায় এবং কেন এটি গুরুত্বপূর্ণ।
বি

73

আন্তর্জাতিকীকরণের কথা মনে আছে!

এখানে সমাধানগুলি কেবল ইংরেজির জন্য কাজ করে। আপনার যদি অন্যান্য ভাষাগুলি সমর্থন করার প্রয়োজন হয় তবে জিনিসগুলি আরও জটিল হয়।

উদাহরণস্বরূপ, স্পেনীয় "1 ম" কে "1.o", "1.a", "1.os" বা "1.as" হিসাবে লেখা হবে যার উপর নির্ভর করে আপনি যে জিনিসটি গণনা করছেন তা পুংলিঙ্গ, স্ত্রীলিঙ্গ বা বহুবচন কিনা !

সুতরাং যদি আপনার সফ্টওয়্যারটির বিভিন্ন ভাষা সমর্থন করার প্রয়োজন হয়, অর্ডিনালগুলি এড়ানোর চেষ্টা করুন।


7
@ আন্দোমার: "প্রথম 2 পাঠক" => ইতালীয় ভাষায় (এবং স্প্যানিশও, আমি মনে করি) "প্রথম" এখানে বহুবচন। সুতরাং আপনার একক পুংলিঙ্গ, এককুলার স্ত্রীলিঙ্গ, বহুবচন পুংলিঙ্গ, বহুবচন স্ত্রীলিঙ্গ আছে; হয়তো কিছু ভাষার ক্ষেত্রেও একটি নিরপেক্ষ কেস রয়েছে (পুরুষ / প্রাণী থেকে পৃথক পৃথক বিষয়)
এম.তাউরিনি

2
এটি বলেছিল, আপনাকে অধ্যাদেশগুলি এড়াতে হবে না: এগুলি স্থানীয়করণের অন্তর্ভুক্ত করুন, আপনি একবার যে সমস্ত কেস মোকাবেলা করতে পারবেন তা জানার পরে বা (আপনার গ্রাহককে) কিছু সীমাবদ্ধতা মেনে নিতে হবে।
এম.টুরিণী

26
এটি ব্যাখ্যা করে যে .NET টিম কেন এটি ডেটটাইম ফর্ম্যাটারগুলিতে যোগ করার বিষয়ে পরিষ্কার নির্দেশ দিয়েছে
ক্রিস এস

moment.js এর লোকেল দ্বারা একটি "অর্ডিনাল" ফর্ম্যাটিং ফাংশন রয়েছে তাই এটি করণীয় বলে মনে হয়, তারাও এটি করতে পারতেন wish ডেটটাইম নেটের জন্য নেট
গিলাইমূম

5
আপনি যদি সমস্ত "" ব্যবহার করেন তবে এটি খুব সহজ হবে। অর্ডিনালের জন্য চরিত্র, যেমন আমরা জার্মান ভাষায় করি)))) ১) ২. ৩. ৪. 5. ইত্যাদি। যদিও অ্যালগরিদমটি আরও বেশি আকর্ষণীয় হবে যদি কেউ সংখ্যাটি লিখতে থাকে, এবং 4-তে সংযোজন যুক্ত করতে হয় 12 টি বিভিন্ন সংমিশ্রণের একক এবং বহুবচনের ক্ষেত্রে 3 টি নিবন্ধের সাথে ব্যাকরণ সংক্রান্ত কেসগুলি। এটি ভাবতে আসুন, রুশিয়ানদের কাছে আরও ২ টি নয়, আরও ভোকাটিভ এবং কিছু নরডিক ভাষায় 15 টি রয়েছে বলে আমি মনে করি। আমি NET এ বাস্তবায়ন দেখতে পছন্দ করতাম।
স্টিফান স্টেইগার

22

জেসির স্টু ও সামজডসনের সংস্করণগুলির আমার সংস্করণ :)

অন্তর্ভুক্ত ইউনিট পরীক্ষাটি দেখানোর জন্য স্বীকৃত উত্তরটি ভুল হয় যখন <1 হয়

    /// <summary>
    /// Get the ordinal value of positive integers.
    /// </summary>
    /// <remarks>
    /// Only works for english-based cultures.
    /// Code from: http://stackoverflow.com/questions/20156/is-there-a-quick-way-to-create-ordinals-in-c/31066#31066
    /// With help: http://www.wisegeek.com/what-is-an-ordinal-number.htm
    /// </remarks>
    /// <param name="number">The number.</param>
    /// <returns>Ordinal value of positive integers, or <see cref="int.ToString"/> if less than 1.</returns>
    public static string Ordinal(this int number)
    {
        const string TH = "th";
        string s = number.ToString();

        // Negative and zero have no ordinal representation
        if (number < 1)
        {
            return s;
        }

        number %= 100;
        if ((number >= 11) && (number <= 13))
        {
            return s + TH;
        }

        switch (number % 10)
        {
            case 1: return s + "st";
            case 2: return s + "nd";
            case 3: return s + "rd";
            default: return s + TH;
        }
    }

    [Test]
    public void Ordinal_ReturnsExpectedResults()
    {
        Assert.AreEqual("-1", (1-2).Ordinal());
        Assert.AreEqual("0", 0.Ordinal());
        Assert.AreEqual("1st", 1.Ordinal());
        Assert.AreEqual("2nd", 2.Ordinal());
        Assert.AreEqual("3rd", 3.Ordinal());
        Assert.AreEqual("4th", 4.Ordinal());
        Assert.AreEqual("5th", 5.Ordinal());
        Assert.AreEqual("6th", 6.Ordinal());
        Assert.AreEqual("7th", 7.Ordinal());
        Assert.AreEqual("8th", 8.Ordinal());
        Assert.AreEqual("9th", 9.Ordinal());
        Assert.AreEqual("10th", 10.Ordinal());
        Assert.AreEqual("11th", 11.Ordinal());
        Assert.AreEqual("12th", 12.Ordinal());
        Assert.AreEqual("13th", 13.Ordinal());
        Assert.AreEqual("14th", 14.Ordinal());
        Assert.AreEqual("20th", 20.Ordinal());
        Assert.AreEqual("21st", 21.Ordinal());
        Assert.AreEqual("22nd", 22.Ordinal());
        Assert.AreEqual("23rd", 23.Ordinal());
        Assert.AreEqual("24th", 24.Ordinal());
        Assert.AreEqual("100th", 100.Ordinal());
        Assert.AreEqual("101st", 101.Ordinal());
        Assert.AreEqual("102nd", 102.Ordinal());
        Assert.AreEqual("103rd", 103.Ordinal());
        Assert.AreEqual("104th", 104.Ordinal());
        Assert.AreEqual("110th", 110.Ordinal());
        Assert.AreEqual("111th", 111.Ordinal());
        Assert.AreEqual("112th", 112.Ordinal());
        Assert.AreEqual("113th", 113.Ordinal());
        Assert.AreEqual("114th", 114.Ordinal());
        Assert.AreEqual("120th", 120.Ordinal());
        Assert.AreEqual("121st", 121.Ordinal());
        Assert.AreEqual("122nd", 122.Ordinal());
        Assert.AreEqual("123rd", 123.Ordinal());
        Assert.AreEqual("124th", 124.Ordinal());
    }

15

সহজ, পরিষ্কার, দ্রুত

    private static string GetOrdinalSuffix(int num)
    {
        if (num.ToString().EndsWith("11")) return "th";
        if (num.ToString().EndsWith("12")) return "th";
        if (num.ToString().EndsWith("13")) return "th";
        if (num.ToString().EndsWith("1")) return "st";
        if (num.ToString().EndsWith("2")) return "nd";
        if (num.ToString().EndsWith("3")) return "rd";
        return "th";
    }

বা আরও ভাল, একটি এক্সটেনশন পদ্ধতি হিসাবে

public static class IntegerExtensions
{
    public static string DisplayWithSuffix(this int num)
    {
        if (num.ToString().EndsWith("11")) return num.ToString() + "th";
        if (num.ToString().EndsWith("12")) return num.ToString() + "th";
        if (num.ToString().EndsWith("13")) return num.ToString() + "th";
        if (num.ToString().EndsWith("1")) return num.ToString() + "st";
        if (num.ToString().EndsWith("2")) return num.ToString() + "nd";
        if (num.ToString().EndsWith("3")) return num.ToString() + "rd";
        return num.ToString() + "th";
    }
}

এখন আপনি কেবল কল করতে পারেন

int a = 1;
a.DisplayWithSuffix(); 

এমনকি সরাসরি হিসাবে

1.DisplayWithSuffix();

14

আপনাকে নিজের রোল করতে হবে। আমার মাথার উপর থেকে:

public static string Ordinal(this int number)
{
  var work = number.ToString();
  if ((number % 100) == 11 || (number % 100) == 12 || (number % 100) == 13)
    return work + "th";
  switch (number % 10)
  {
    case 1: work += "st"; break;
    case 2: work += "nd"; break;
    case 3: work += "rd"; break;
    default: work += "th"; break;
  }
  return work;
}

আপনি তারপর করতে পারেন

Console.WriteLine(432.Ordinal());

11/12/13 ব্যতিক্রমগুলির জন্য সম্পাদিত। আমি আমার মাথার উপর থেকে বলেছিলাম :-)

1011-এর জন্য সম্পাদিত - অন্যরা এটি ইতিমধ্যে ঠিক করেছে, কেবল অন্যরাও এই ভুল সংস্করণটি গ্রহণ করবেন না তা নিশ্চিত করতে চান।


12

আমি বরং স্টু এবং সামজডসনের সমাধান উভয়েরই উপাদানগুলি পছন্দ করেছি এবং সেগুলিকে একসাথে আমি কী ব্যবহারযোগ্য কম্বো বলে মনে করি তাতে কাজ করেছি:

    public static string Ordinal(this int number)
    {
        const string TH = "th";
        var s = number.ToString();

        number %= 100;

        if ((number >= 11) && (number <= 13))
        {
            return s + TH;
        }

        switch (number % 10)
        {
            case 1:
                return s + "st";
            case 2:
                return s + "nd";
            case 3:
                return s + "rd";
            default:
                return s + TH;
        }
    }

1
"ম" এর জন্য একটি ধ্রুবক ব্যবহার করার পিছনে যুক্তি কি?
নিকফ

কারণ এটি কোডে দুবার ব্যবহার করা হয়েছে। কেবলমাত্র বয়সের জ্ঞানকে কাজে লাগান যা আপনার নিজের পুনরাবৃত্তি করা উচিত নয়: এই ক্ষেত্রে, .NET রানটাইমটি কোডটিতে দুটি "ম" এর সাথে স্ট্রিংয়ের একটি অনুলিপি তৈরি করতে হবে, সেখানে দুটি স্ট্রিং তৈরি হবে এবং মেমরি রেফারেন্স।
জেসি সি স্লিকার

25
এবং এছাড়াও, যদি TH এর মান কখনও পরিবর্তিত হয়, আপনি সেট হয়ে যাবেন।
অন্ধকার

7
@ জেসি - আপনি আমার +1 পান, তবে আমি বিশ্বাস করি না ET নেট এভাবে স্ট্রিং পরিচালনা করে, yoda.arachsys.com/csharp/strings.html# অন্তর্নির্মিত দেখুন , তার আমার পড়াটি "আক্ষরিক" আক্ষরিক প্রতিটি রেফারেন্স স্মৃতি একই বিট রেফারেন্স হবে। তবে আমি
ডিআরওয়াই

4
এই জাতীয় সদৃশতা সরিয়ে ফেলা কেবল আমার মনে হয় পাঠযোগ্যতা বাধাগ্রস্থ করে, তাই বিভ্রান্তি "কেন TH?"। আমি মনে করি না যে DRY এর অর্থ 'যাই হোক না কেন সমস্ত নকল অপসারণ' হিসাবে ব্যাখ্যা করা উচিত।
ননউইভিল

8

যদিও আমি এখনও এটি বেঞ্চমার্ক করি নি, আপনি সমস্ত শর্তাধীন কেস স্টেটমেন্ট এড়িয়ে আরও ভাল পারফরম্যান্স পেতে সক্ষম হবেন।

এটি জাভা, তবে সি # তে একটি বন্দর তুচ্ছ:

public class NumberUtil {
  final static String[] ORDINAL_SUFFIXES = {
    "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"
  };

  public static String ordinalSuffix(int value) {
    int n = Math.abs(value);
    int lastTwoDigits = n % 100;
    int lastDigit = n % 10;
    int index = (lastTwoDigits >= 11 && lastTwoDigits <= 13) ? 0 : lastDigit;
    return ORDINAL_SUFFIXES[index];
  }

  public static String toOrdinal(int n) {
    return new StringBuffer().append(n).append(ordinalSuffix(n)).toString();
  }
}

দ্রষ্টব্য, কন্ডিশনাল হ্রাস এবং অ্যারে লুকোচুরির ব্যবহারের ফলে কড়া লুপে প্রচুর অর্ডিনাল তৈরি করা পারফরম্যান্সকে ত্বরান্বিত করা উচিত। তবে আমি স্বীকারও করি যে এটি কেস স্টেটমেন্ট সমাধানের মতো পাঠযোগ্য নয়।


দুঃখিত যে আমি এটি সি # তে বেঞ্চমার্ক করেছি, আপনার সংস্করণটি si618 এর সমাধানের চেয়ে দ্রুত নয়।
জিওয়াই_১৯

এই উত্তরটি পরীক্ষা stackoverflow.com/a/58378465/2583579 কিছু benchmarks জন্য
ড্যান Dohotaru

3

রায়ানের সমাধানের মতো, তবে আরও বেসিক, আমি কেবল একটি সরল অ্যারে ব্যবহার করি এবং সঠিক অর্ডিনালটি সন্ধান করতে দিনটি ব্যবহার করি:

private string[] ordinals = new string[] {"","st","nd","rd","th","th","th","th","th","th","th","th","th","th","th","th","th","th","th","th","th","st","nd","rd","th","th","th","th","th","th","th","st" };
DateTime D = DateTime.Now;
String date = "Today's day is: "+ D.Day.ToString() + ordinals[D.Day];

আমার প্রয়োজন নেই তবে আমি ধরে নেব আপনি একাধিক ভাষার সমর্থন পেতে চাইলে আপনি একটি বহুমাত্রিক অ্যারে ব্যবহার করতে পারেন।

আমার ইউনির দিনগুলি থেকে আমি যা মনে রাখতে পারি সেগুলি থেকে এই পদ্ধতির জন্য সার্ভারের সর্বনিম্ন প্রচেষ্টা প্রয়োজন।


2

আমি এই এক্সটেনশন ক্লাসটি ব্যবহার করি:

public static class Int32Extensions
{
    public static string ToOrdinal(this int i)
    {
        return (i + "th")
            .Replace("1th", "1st")
            .Replace("2th", "2nd")
            .Replace("3th", "3rd");
    }
}

11 ই, 12 তম, 13 তম
কেকডার

2

সামজডসনের উত্তরের "কম রিডানডেন্সি" সংস্করণ অনুরোধ করা হয়েছে ...

public static string AddOrdinal(int number)
{
    if (number <= 0) return number.ToString();

    string GetIndicator(int num)
    {
        switch (num % 100)
        {
            case 11:
            case 12:
            case 13:
                return "th";
        }

        switch (num % 10)
        {
            case 1:
                return "st";
            case 2:
                return "nd";
            case 3:
                return "rd";
            default:
                return "th";
        }
    }

    return number + GetIndicator(number);
}

2
আমি "গেটইন্ডিসিটার" কে একটি হিসাবে প্রকাশ করব public staticএবং এটিকে আরও স্মৃতিবিজ্ঞানের (যেমন "অর্ডিনালসফিক্স") নামকরণ করব। কলার নম্বরটি বিভিন্ন ফরম্যাটে (অর্থাত কমা সহ) চাইবে।
টম

2
        private static string GetOrd(int num) => $"{num}{(!(Range(11, 3).Any(n => n == num % 100) ^ Range(1, 3).All(n => n != num % 10)) ? new[] { "ˢᵗ", "ⁿᵈ", "ʳᵈ" }[num % 10 - 1] : "ᵗʰ")}";

যদি কেউ একটি লাইনার খুঁজছেন: পি


1
public static string OrdinalSuffix(int ordinal)
{
    //Because negatives won't work with modular division as expected:
    var abs = Math.Abs(ordinal); 

    var lastdigit = abs % 10; 

    return 
        //Catch 60% of cases (to infinity) in the first conditional:
        lastdigit > 3 || lastdigit == 0 || (abs % 100) - lastdigit == 10 ? "th" 
            : lastdigit == 1 ? "st" 
            : lastdigit == 2 ? "nd" 
            : "rd";
}

1

সম্পাদনা : ওয়াইএম_ইন্ডাস্ট্রিজ মন্তব্যে যেমন উল্লেখ করেছেন, সামজডসনের উত্তর 1000 এরও বেশি সংখ্যার জন্য কাজ করে, নিকফের মন্তব্যটি মনে হয়েছে যে আমি কী সমস্যাটি দেখেছিলাম তা মনে করতে পারছি না। তুলনার সময়গুলির জন্য এই উত্তরটি এখানে রেখে দিন।

নিকফ একটি মন্তব্যে উল্লেখ করেছেন ( এডিআইটি : এখন নিখোঁজ) যেমন সংখ্যক> 999 নম্বরের জন্য কাজ করে না ।

এখানে একটি পরিমার্জিত সংস্করণ বন্ধ ভিত্তি করে একটি সংস্করণ samjudson 's গৃহীত উত্তর যে আছে।

public static String GetOrdinal(int i)
{
    String res = "";

    if (i > 0)
    {
        int j = (i - ((i / 100) * 100));

        if ((j == 11) || (j == 12) || (j == 13))
            res = "th";
        else
        {
            int k = i % 10;

            if (k == 1)
                res = "st";
            else if (k == 2)
                res = "nd";
            else if (k == 3)
                res = "rd";
            else
                res = "th";
        }
    }

    return i.ToString() + res;
}

এছাড়াও শাহজাদ কোরেশী এর উত্তর স্ট্রিং ম্যানিপুলেশন ব্যবহার কাজ করে জরিমানা, তবে এটা একটি কার্যকারিতা শাস্তি নেই। এর অনেকগুলি উত্পাদন করার জন্য, একটি লিনিকপ্যাড উদাহরণস্বরূপ প্রোগ্রামটি স্ট্রিং সংস্করণটিকে এই পূর্ণসংখ্যার চেয়ে 6-7 গুণ কম করে দেয় (যদিও আপনাকে লক্ষ্য করার জন্য অনেক কিছু তৈরি করতে হবে)।

লিনকিউপ্যাড উদাহরণ:

void Main()
{
    "Examples:".Dump();

    foreach(int i in new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22, 113, 122, 201, 202, 211, 212, 2013, 1000003, 10000013 })
        Stuff.GetOrdinal(i).Dump();

    String s;

    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();

    for(int iter = 0; iter < 100000; iter++)
        foreach(int i in new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22, 113, 122, 201, 202, 211, 212, 2013, 1000003, 1000013 })
            s = Stuff.GetOrdinal(i);

    "Integer manipulation".Dump();
    sw.Elapsed.Dump();

    sw.Restart();

    for(int iter = 0; iter < 100000; iter++)
        foreach(int i in new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22, 113, 122, 201, 202, 211, 212, 2013, 1000003, 1000013 })
            s = (i.ToString() + Stuff.GetOrdinalSuffix(i));

    "String manipulation".Dump();
    sw.Elapsed.Dump();
}

public class Stuff
{
        // Use integer manipulation
        public static String GetOrdinal(int i)
        {
                String res = "";

                if (i > 0)
                {
                        int j = (i - ((i / 100) * 100));

                        if ((j == 11) || (j == 12) || (j == 13))
                                res = "th";
                        else
                        {
                                int k = i % 10;

                                if (k == 1)
                                        res = "st";
                                else if (k == 2)
                                        res = "nd";
                                else if (k == 3)
                                        res = "rd";
                                else
                                        res = "th";
                        }
                }

                return i.ToString() + res;
        }

        // Use string manipulation
        public static string GetOrdinalSuffix(int num)
        {
                if (num.ToString().EndsWith("11")) return "th";
                if (num.ToString().EndsWith("12")) return "th";
                if (num.ToString().EndsWith("13")) return "th";
                if (num.ToString().EndsWith("1")) return "st";
                if (num.ToString().EndsWith("2")) return "nd";
                if (num.ToString().EndsWith("3")) return "rd";
                return "th";
        }
}

আমি @ নিকফের মন্তব্য খুঁজে পাচ্ছি না, সামজডসনের উত্তরের কী দোষ? এটি আপনার চেয়ে অনেক বেশি পাঠযোগ্য হওয়ার সময় এটি 1000 এর উপরে সংখ্যাগুলি পরিচালনা করার মতো বলে মনে হয়।
জোশুয়া ওয়ালশ

1
এটি একটি নিখুঁত মন্তব্য, আমি কেবল একটি পরীক্ষা সেট চালিয়েছি এবং আমি কোনও সমস্যা খুঁজে পাচ্ছি না। স্যামের উত্তরের কোনও সম্পাদনা হয়েছে বলে মনে হয় না তাই আমি কেবল ভাবতে পারি যে আমি পাগল হয়ে যাচ্ছি। আমি প্রতিফলিত করতে আমার উত্তর সম্পাদনা করেছি।
ওয়েলকাহোলিজম

1
হাহাহা, আমাদের সবার কি এমন মুহুর্ত থাকে না? আমরা পুরানো কোডটির দিকে ফিরে তাকাই এবং "আমি কেন এটি লিখলাম?"
জোশুয়া ওয়ালশ

1

অন্যান্য উত্তর ভিত্তিক:

public static string Ordinal(int n)
{   
    int     r = n % 100,     m = n % 10;

    return (r<4 || r>20) && (m>0 && m<4) ? n+"  stndrd".Substring(m*2,2) : n+"th";                                              
}

3
1 ম প্লেস: সর্বাধিক অহেতুক ক্রিপ্টিক উত্তর। "অপ্রয়োজনীয়ভাবে": কোডের আকার / পারফরম্যান্সের সুবিধাগুলি পড়ার যোগ্যতার জন্য ব্যয়যোগ্য নয়। "ক্রিপটিক": "লেয়ারপারসন" প্রয়োজনীয়তার মানচিত্রের জন্য উল্লেখযোগ্য অনুবাদ দরকার।
টম

0

এমএস-এসকিউএল-এর জন্য এফডাব্লুআইডাব্লু, এই এক্সপ্রেশনটি কাজটি করবে। প্রথম WHEN ( WHEN num % 100 IN (11, 12, 13) THEN 'th') কে তালিকায় প্রথম হিসাবে রাখুন , কারণ এটি অন্যের আগে বিচার হওয়ার চেষ্টা করে।

CASE
  WHEN num % 100 IN (11, 12, 13) THEN 'th' -- must be tried first
  WHEN num % 10 = 1 THEN 'st'
  WHEN num % 10 = 2 THEN 'nd'
  WHEN num % 10 = 3 THEN 'rd'
  ELSE 'th'
END AS Ordinal

এক্সেলের জন্য:

=MID("thstndrdth",MIN(9,2*RIGHT(A1)*(MOD(A1-11,100)>2)+1),2)

(FALSE = 0) এর (MOD(A1-11,100)>2)শেষ হওয়া ব্যতীত সমস্ত সংখ্যার জন্য হ'ল প্রকাশ (1 11,12,13) হয়। সুতরাং 2 * RIGHT(A1) * (MOD(A1-11,100)>2) +1)11/12/13 এর জন্য 1 হিসাবে শেষ হবে, অন্যথায়:
1 টি 3
2 থেকে 5,
3 থেকে 7
জনকে মূল্যায়ন করে: 9
- এবং প্রয়োজনীয় 2 টি অক্ষর থেকে নির্বাচিত হয়"thstndrdth" সেই অবস্থান শুরু ।

আপনি যদি সত্যিই এটিকে মোটামুটি সরাসরি এসকিউএলে রূপান্তর করতে চান, তবে এটি আমার জন্য পরীক্ষামূলক মূল্যগুলির একটি মুষ্টিমেয় কাজ করেছে:

DECLARE @n as int
SET @n=13
SELECT SubString(  'thstndrdth'
                 , (SELECT MIN(value) FROM
                     (SELECT 9 as value UNION
                      SELECT 1+ (2* (ABS(@n) % 10)  *  CASE WHEN ((ABS(@n)+89) % 100)>2 THEN 1 ELSE 0 END)
                     ) AS Mins
                   )
                 , 2
                )

0

এটি হচ্ছে বাস্তবায়ন dartএবং ভাষা অনুযায়ী পরিবর্তন করা যেতে পারে।

String getOrdinalSuffix(int num){
    if (num.toString().endsWith("11")) return "th";
    if (num.toString().endsWith("12")) return "th";
    if (num.toString().endsWith("13")) return "th";
    if (num.toString().endsWith("1")) return "st";
    if (num.toString().endsWith("2")) return "nd";
    if (num.toString().endsWith("3")) return "rd";
    return "th";
}

0

এখানে প্রচুর ভাল উত্তর পাওয়া গেলেও, আমি অনুমান করি যে অন্য কোনওটির জন্য এই জায়গা রয়েছে, এবার প্যাটার্ন মিলের ভিত্তিতে, অন্য কোনও কিছুর জন্য না হলে, তবে কমপক্ষে বিতর্কযোগ্য পাঠযোগ্যতার জন্য

    public static string Ordinals1(this int number)
    {
        switch (number)
        {
            case int p when p % 100 == 11:
            case int q when q % 100 == 12:
            case int r when r % 100 == 13:
                return $"{number}th";
            case int p when p % 10 == 1:
                return $"{number}st";
            case int p when p % 10 == 2:
                return $"{number}nd";
            case int p when p % 10 == 3:
                return $"{number}rd";
            default:
                return $"{number}th";
        }
    }

এবং কি এই সমাধান বিশেষ করে তোলে? আমি অন্যান্য বিভিন্ন সমাধানের জন্য কিছু পারফরম্যান্স বিবেচনা যুক্ত করছি তা ছাড়া কিছুই নয়

সত্যই আমি সন্দেহ করি যে পারফরম্যান্সটি এই নির্দিষ্ট দৃশ্যের জন্য সত্যই গুরুত্বপূর্ণ (যার সত্যই লক্ষ লক্ষ সংখ্যার অর্ডিনাল দরকার) তবে কমপক্ষে এটি কিছু তুলনা বিবেচনায় নেওয়ার জন্য প্রকাশিত হয় ...

রেফারেন্সের জন্য 1 মিলিয়ন আইটেম (অবশ্যই আপনার মেশিন অবশ্যই মেশিনের চশমার উপর ভিত্তি করে পরিবর্তিত হতে পারে)

প্যাটার্ন মিল এবং বিভাগগুলির সাথে (এই উত্তর)

22 622 এমএস

প্যাটার্ন মিল এবং স্ট্রিং সহ (এই উত্তর)

67 1967 এমএস

দুটি স্যুইচ এবং বিভাগ সহ (স্বীকৃত উত্তর)

7 637 এমএস

একটি স্যুইচ এবং বিভাগ সহ (অন্য উত্তর)

25 725 এমএস

void Main()
{
    var timer = new Stopwatch();
    var numbers = Enumerable.Range(1, 1000000).ToList();

    // 1
    timer.Reset();
    timer.Start();
    var results1 = numbers.Select(p => p.Ordinals1()).ToList();
    timer.Stop();
    timer.Elapsed.TotalMilliseconds.Dump("with pattern matching and divisions");

    // 2
    timer.Reset();
    timer.Start();
    var results2 = numbers.Select(p => p.Ordinals2()).ToList();
    timer.Stop();
    timer.Elapsed.TotalMilliseconds.Dump("with pattern matching and strings");

    // 3
    timer.Reset();
    timer.Start();
    var results3 = numbers.Select(p => p.Ordinals3()).ToList();
    timer.Stop();
    timer.Elapsed.TotalMilliseconds.Dump("with two switches and divisons");

    // 4
    timer.Reset();
    timer.Start();
    var results4 = numbers.Select(p => p.Ordinals4()).ToList();
    timer.Stop();
    timer.Elapsed.TotalMilliseconds.Dump("with one switche and divisons");
}

public static class Extensions
{
    public static string Ordinals1(this int number)
    {
        switch (number)
        {
            case int p when p % 100 == 11:
            case int q when q % 100 == 12:
            case int r when r % 100 == 13:
                return $"{number}th";
            case int p when p % 10 == 1:
                return $"{number}st";
            case int p when p % 10 == 2:
                return $"{number}nd";
            case int p when p % 10 == 3:
                return $"{number}rd";
            default:
                return $"{number}th";
        }
    }

    public static string Ordinals2(this int number)
    {
        var text = number.ToString();
        switch (text)
        {
            case string p when p.EndsWith("11"):
                return $"{number}th";
            case string p when p.EndsWith("12"):
                return $"{number}th";
            case string p when p.EndsWith("13"):
                return $"{number}th";
            case string p when p.EndsWith("1"):
                return $"{number}st";
            case string p when p.EndsWith("2"):
                return $"{number}nd";
            case string p when p.EndsWith("3"):
                return $"{number}rd";
            default:
                return $"{number}th";
        }
    }

    public static string Ordinals3(this int number)
    {
        switch (number % 100)
        {
            case 11:
            case 12:
            case 13:
                return $"{number}th";
        }

        switch (number % 10)
        {
            case 1:
                return $"{number}st";
            case 2:
                return $"{number}nd";
            case 3:
                return $"{number}rd";
            default:
                return $"{number}th";
        }
    }

    public static string Ordinals4(this int number)
    {
        var ones = number % 10;
        var tens = Math.Floor(number / 10f) % 10;
        if (tens == 1)
        {
            return $"{number}th";
        }

        switch (ones)
        {
            case 1:
                return $"{number}th";
            case 2:
                return $"{number}nd";
            case 3:
                return $"{number}rd";
            default:
                return $"{number}th";
        }
    }
}

0

আরেকটি ওয়ান-লাইনার, তবে কেবল রেজেক্স ফলাফলকে একটি অ্যারেতে সূচক করে তুলনা ছাড়াই।

public static string GetOrdinalSuffix(int input)
{
    return new []{"th", "st", "nd", "rd"}[Convert.ToInt32("0" + Regex.Match(input.ToString(), "(?<!1)[1-3]$").Value)];
}

পাওয়ারশেল সংস্করণটি আরও ছোট করা যেতে পারে:

function ord($num) { return ('th','st','nd','rd')[[int]($num -match '(?<!1)[1-3]$') * $matches[0]] }

0

অন্য 1 লাইনার।

public static string Ordinal(this int n)
{    
 return n + (new [] {"st","nd","rd" }.ElementAtOrDefault((((n + 90) % 100 - 10) % 10 - 1)) ?? "th");
}

-2

এখানে ডেটটাইম এক্সটেনশন ক্লাস। অনুলিপি করুন, আটকান এবং উপভোগ করুন

পাবলিক স্ট্যাটিক ক্লাস ডেটটাইম এক্সটেনশনস {

    public static string ToStringWithOrdinal(this DateTime d)
    {
        var result = "";
        bool bReturn = false;            

        switch (d.Day % 100)
        {
            case 11:
            case 12:
            case 13:
                result = d.ToString("dd'th' MMMM yyyy");
                bReturn = true;
                break;
        }

        if (!bReturn)
        {
            switch (d.Day % 10)
            {
                case 1:
                    result = d.ToString("dd'st' MMMM yyyy");
                    break;
                case 2:
                    result = d.ToString("dd'nd' MMMM yyyy");
                    break;
                case 3:
                    result = d.ToString("dd'rd' MMMM yyyy");
                    break;
                default:
                    result = d.ToString("dd'th' MMMM yyyy");
                    break;
            }

        }

        if (result.StartsWith("0")) result = result.Substring(1);
        return result;
    }
}

ফলাফল :

9 ই অক্টোবর 2014


আপনি সদৃশ করছেন: ক) তারিখ বিন্যাসের স্ট্রিং (এক্স 5) এবং খ) সম্পূর্ণ পদ্ধতিটি (যখন সম্ভবত ব্যবহারের কেস দেখা দেয় (যদি এটি ইতিমধ্যে ইতিমধ্যে না থাকে)) যে মাসের অ-দিবসের জন্য একটি সাধারণ প্রত্যয় প্রয়োজন উদ্দেশ্য বা এমনকি কোনও আলাদা তারিখ ফর্ম্যাট স্ট্রিং সহ মাসের একটি দিন)। "OrdinalSuffix" পদ্ধতি আমি 16:32 উত্তর (এ ইয়ান Warburton এর এপ্রিল 6 '17 থেকে উন্মুক্ত করা প্রস্তাবিত ব্যবহার stackoverflow.com/questions/20156/... )।
টম

-3

অন্য সমস্ত পরামর্শ যা আমি অন্যান্য সমস্ত পরামর্শের ভিত্তিতে ব্যবহার করেছি, তবে এর জন্য কোনও বিশেষ কেসিংয়ের প্রয়োজন নেই:

    public static string DateSuffix(int day)
    {
        if (day == 11 | day == 12 | day == 13) return "th";
        Math.DivRem(day, 10, out day);
        switch (day)
        {
            case 1:
                return "st";
            case 2:
                return "nd";
            case 3:
                return "rd";
            default:
                return "th";
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.