2008-09-16 6 views
59

मैं अगर वहाँ एक विधि या प्रारूप स्ट्रिंग मैं नेट में याद कर रहा हूँ निम्नलिखित कन्वर्ट करने के लिए है सोच रहा हूँ:क्या .NET में "सेंट", "एनडी", "rd" और "वें" संख्याओं के लिए अंत में कोई आसान तरीका है?

1 to 1st 
    2 to 2nd 
    3 to 3rd 
    4 to 4th 
    11 to 11th 
101 to 101st 
111 to 111th 

This link बुनियादी अपने खुद के समारोह लेखन में शामिल सिद्धांत का एक बुरा उदाहरण है, लेकिन मैं अगर मैं एक अंतर्निहित क्षमता है तो मुझे और अधिक उत्सुकता है।

समाधान

स्कॉट Hanselman जवाब को स्वीकार कर लिया है क्योंकि यह सवाल सीधे जवाब देती है।

एक समाधान तथापि के लिए, this great answer देखते हैं।

+3

वे क्रमसूचक संख्या (1st, 2nd, आदि) कहा जाता है के रूप में, गणन संख्या (1,2,3, आदि) के लिए विरोध FYI करें। – pc1oad1etter

+1

इसका उत्तर यहां बहुत सुंदरता से दिया गया था: http://stackoverflow.com/questions/20156/ordinals-in-c# – Portman

+0

हाँ मैंने आपका जवाब देखा। –

उत्तर

53

नहीं, .NET बेस क्लास लाइब्रेरी में कोई अंतर्निहित क्षमता नहीं है।

+8

यह एक देर से टिप्पणी है, लेकिन क्या तारीखों को प्रारूपित करने के लिए .NET BCL को यह क्षमता जोड़ने की कोई योजना है? – Breakskater

79

यह एक ऐसा कार्य है जो आपके विचार से बहुत आसान है। यद्यपि इसके लिए पहले से अस्तित्व में एक .NET फ़ंक्शन हो सकता है, निम्न कार्य (PHP में लिखा गया) नौकरी करता है। इसे बंद करने के लिए यह बहुत कठिन नहीं होना चाहिए।

function ordinal($num) { 
    $ones = $num % 10; 
    $tens = floor($num/10) % 10; 
    if ($tens == 1) { 
     $suff = "th"; 
    } else { 
     switch ($ones) { 
      case 1 : $suff = "st"; break; 
      case 2 : $suff = "nd"; break; 
      case 3 : $suff = "rd"; break; 
      default : $suff = "th"; 
     } 
    } 
    return $num . $suff; 
} 
+0

स्थानीयकरण के बारे में क्या? – macbirdie

+2

स्थानीयकरण का अर्थ यह होगा कि आपको प्रत्येक भाषा के लिए अलग-अलग फ़ंक्शन बनाना होगा। जर्मन में, आप बस "ter" जोड़ सकते हैं, लेकिन "1ter" "2ter" "3ter" वास्तव में खराब दिखता है, भले ही यह व्याकरणिक रूप से सही हो। फ्रेंच में, यह थोड़ा बेहतर है, लेकिन हर भाषा के लिए कोई सार्वभौमिक तरीका नहीं है। –

+0

@ माइकल स्टम: मैं सभी अंतरराष्ट्रीय ordinal प्रारूपों से बहुत परिचित नहीं हूं लेकिन एक स्ट्रिंग होगा। फोर्मेट (resString, संख्या) पर्याप्त है? या कुछ भाषाएं क्रमिक (पूर्व/पर्याप्त) ixes के साथ संख्याओं को गठबंधन नहीं करती हैं? –

12

यह पहले से ही कवर किया गया है लेकिन मुझे यकीन है कि इससे कैसे लिंक किया जाए।

public static string Ordinal(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 + "st"; 
      case 2: return number + "nd"; 
      case 3: return number + "rd"; 
      default: return number + "th"; 
     } 
    } 

FYI करें:: यहाँ कोड SNIPPIT है यह एक विस्तार पद्धति के रूप में है। अपने नेट संस्करण 3.5 से भी कम है, तो बस इस कीवर्ड को दूर

[संपादित करें]: उनका कहना है कि यह सही नहीं था के लिए धन्यवाद, कि आप प्रतिलिपि करने/चिपकाने कोड :)

+4

काम नहीं करता है। 1011% 10 == 1. 1011st गलत है। एक्सटेंशन विधि –

+0

+1 मुझे यह पसंद है कि आप चर परिवर्तनीय कैसे घोषित करते हैं और इसका कभी भी उपयोग नहीं करते हैं। –

+8

के लिए –

-6

के लिए क्या मिलता है मुझे लगता है कि क्रमसूचक प्रत्यय है प्राप्त करना मुश्किल है ... आपको मूल रूप से एक फ़ंक्शन लिखना होता है जो संख्याओं का परीक्षण करने और प्रत्यय जोड़ने के लिए स्विच का उपयोग करता है।

इस भाषा को आंतरिक रूप से प्रदान करने के लिए कोई कारण नहीं है, खासकर जब यह लोकेल विशिष्ट है।

आप थोड़ा उस लिंक जब यह लिखने के लिए कोड की राशि के लिए आता है से बेहतर कर सकते, लेकिन आप इस के लिए एक समारोह कोड करने के लिए है ...

+1

सभी मुद्रा स्थानीयकरण स्ट्रिंग इत्यादि को देखते हुए यह औपचारिक प्रत्यय जोड़ने के लिए थोड़ा सा लगता है। –

54

@nickf: यहाँ सी # में पीएचपी समारोह है :

CREATE FUNCTION [Internal].[GetNumberAsOrdinalString] 
(
    @num int 
) 
RETURNS nvarchar(max) 
AS 
BEGIN 

    DECLARE @Suffix nvarchar(2); 
    DECLARE @Ones int; 
    DECLARE @Tens int; 

    SET @Ones = @num % 10; 
    SET @Tens = FLOOR(@num/10) % 10; 

    IF @Tens = 1 
    BEGIN 
     SET @Suffix = 'th'; 
    END 
    ELSE 
    BEGIN 

    SET @Suffix = 
     CASE @Ones 
      WHEN 1 THEN 'st' 
      WHEN 2 THEN 'nd' 
      WHEN 3 THEN 'rd' 
      ELSE 'th' 
     END 
    END 

    RETURN CONVERT(nvarchar(max), @num) + @Suffix; 
END 
+0

हा धन्यवाद, बस मैंने लिखा कोड पोस्ट करने के बारे में। तुम्हारा भी स्ट्रिंग के साथ मेरा धड़कता है। मुझे लगता है कि थोड़ा सा लगता है। –

+0

1) दशमलव पर रूपांतरण क्यों? एक सरल '(संख्या/10)% 10' चाल करता है। 2) आप 'प्रत्यय' को उस मान पर क्यों शुरू करते हैं जिसका उपयोग कभी नहीं किया जाएगा? – CodesInChaos

+0

@CodesInChaos: दशमलव में रूपांतरण के बिना, आपको एक कंपाइलर त्रुटि मिलती है: 'कॉल निम्न विधियों या गुणों के बीच संदिग्ध है:' System.Math.Floor (दशमलव) 'और' System.Math.Floor (double) '' । 'प्रत्यय 'को' स्ट्रिंग 'में शुरू करना' लक्षण 'ज्यादातर आदत है लेकिन यह असामान्य' असाइन किए गए स्थानीय चर 'प्रत्यय' त्रुटियों का उपयोग करने में भी मदद करता है। –

-3
else if (choice=='q') 
{ 
    qtr++; 

    switch (qtr) 
    { 
     case(2): strcpy(qtrs,"nd");break; 
     case(3): 
     { 
      strcpy(qtrs,"rd"); 
      cout<<"End of First Half!!!"; 
      cout<<" hteam "<<"["<<hteam<<"] "<<hs; 
      cout<<" vteam "<<" ["<<vteam; 
      cout<<"] "; 
      cout<<vs;dwn=1;yd=10; 

      if (beginp=='H') team='V'; 
      else    team='H'; 
      break; 
     } 
     case(4): strcpy(qtrs,"th");break; 
+1

आओ। आप क्या लिख ​​रहे हैं? मेरे पास मेरे प्रश्न से कोई लेना देना नहीं है। – santubangalore

8

यहाँ एक Microsoft SQL सर्वर समारोह संस्करण है ओपी के सवाल, लेकिन क्योंकि मैं इसे उपयोगी इस धागे से एसक्यूएल सर्वर समारोह लिफ्ट करने के लिए मिल गया है, यहाँ एक डेल्फी (पास्कल) बराबर है:

function OrdinalNumberSuffix(const ANumber: integer): string; 
begin 
    Result := IntToStr(ANumber); 
    if(((Abs(ANumber) div 10) mod 10) = 1) then // Tens = 1 
    Result := Result + 'th' 
    else 
    case(Abs(ANumber) mod 10) of 
     1: Result := Result + 'st'; 
     2: Result := Result + 'nd'; 
     3: Result := Result + 'rd'; 
     else 
     Result := Result + 'th'; 
    end; 
end; 

करता है ..., -1st, 0 मेकअप भावना?

+0

मैंने अभी लिखा है कि समारोह लगभग verbatim! मतभेद: मास्टर डीबी, कन्वर्ट करने के बजाय कास्ट, और मैं थोड़ा अलग इंडेंटिंग का उपयोग करता हूं। महान दिमाग, मुझे लगता है ... –

+0

+1 - बस एक SQL संस्करण की आवश्यकता थी - मुझे एक – HeavenCore

+0

शानदार लिखने में सहेजा गया, लेकिन केवल तभी हम SQL से प्राप्त कर रहे हैं। लेकिन इस मामले में मैं एक .net डेटटाइम चर स्वरूपण कर रहा हूं। लेकिन यह समारोह बेहद उपयोगी होगा। – santubangalore

2

मैं यह जानता है का उत्तर नहीं:

public static string Ordinal(int number) 
{ 
    string suffix = String.Empty; 

    int ones = number % 10; 
    int tens = (int)Math.Floor(number/10M) % 10; 

    if (tens == 1) 
    { 
     suffix = "th"; 
    } 
    else 
    { 
     switch (ones) 
     { 
      case 1: 
       suffix = "st"; 
       break; 

      case 2: 
       suffix = "nd"; 
       break; 

      case 3: 
       suffix = "rd"; 
       break; 

      default: 
       suffix = "th"; 
       break; 
     } 
    } 
    return String.Format("{0}{1}", number, suffix); 
} 
+0

उत्कृष्ट जवाब। – santubangalore

50

, सरल स्वच्छ, जल्दी

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

शायद सबसे सुन्दर उत्तर यहां। –

+1

मुझे लगता है कि यह करने के लिए यह सबसे साफ तरीका है –

+1

सबसे अच्छा जवाब नीचे हाथ। यह वास्तव में कुछ जटिल गणितीय सूत्र का उपयोग करने की कोशिश करने के बजाय पाठ के रूप में संख्या पर निर्भर करता है। यह बिल्कुल ठीक है कि मानव मस्तिष्क स्वयं इसे कैसे समझ पाएगा, और यह आदर्श है। –

0

एक और स्वाद:

/// <summary> 
/// Extension methods for numbers 
/// </summary> 
public static class NumericExtensions 
{ 
    /// <summary> 
    /// Adds the ordinal indicator to an integer 
    /// </summary> 
    /// <param name="number">The number</param> 
    /// <returns>The formatted number</returns> 
    public static string ToOrdinalString(this int number) 
    { 
     // Numbers in the teens always end with "th" 

     if((number % 100 > 10 && number % 100 < 20)) 
      return number + "th"; 
     else 
     { 
      // Check remainder 

      switch(number % 10) 
      { 
       case 1: 
        return number + "st"; 

       case 2: 
        return number + "nd"; 

       case 3: 
        return number + "rd"; 

       default: 
        return number + "th"; 
      } 
     } 
    } 
} 
+0

'111' – CodesInChaos

+0

अच्छी पकड़ के लिए विफल। फिक्स्ड। –

+0

वास्तव में एक अच्छा जवाब है। लेकिन यह सामान्य है, यानी एक महीने की तारीखों के लिए विशिष्ट नहीं है। मेरा मतलब केवल तिथियां थीं। तो 100 से ऊपर लागू नहीं हो सकता है। – santubangalore

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

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