在.NET中有一个简单的方法来获得数字的“st”,“nd”,“rd”和“th”结尾吗?

我想知道是否有一种方法或格式string我在.NET中缺less转换以下内容:

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

这个链接在编写自己的函数时涉及到一个基本原理的坏例子,但是如果我缺less一个内置的能力,我更加好奇。

Scott Hanselman的答案是被接受的,因为它直接回答了问题。

然而,对于一个解决scheme,请看这个好的答案

不,.NET Base Class Library中没有内置function。

这是一个比你想象的要简单得多的function。 虽然可能有一个.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; } 

@nickf:这是C#中的PHP函数:

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

简单,干净,快捷

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

这已经被覆盖,但我不确定如何链接到它。 这里是代码snippit:

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

仅供参考:这是一个扩展方法。 如果你的.NET版本小于3.5,只需删除这个关键字

[编辑]:感谢指出,这是不正确的,这就是你得到的复制/粘贴代码:)

这是一个Microsoft SQL Serverfunction版本:

 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 

我知道这不是OP的问题的答案,但是因为我发现从这个线程中提取SQL Server函数是有用的,所以这里是一个Delphi(Pascal)的等价物:

 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; 

…,-1,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"; } 

另一个味道:

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

我认为序号后缀很难得到…你基本上必须写一个函数,使用开关来testing数字并添加后缀。

一个语言没有理由在内部提供这个语言,特别是当它是语言环境特定的时候。

当涉及到大量的代码编写时,你可以做得比这个链接好一点,但是你必须为此编写一个函数…