C’è un modo semplice in .NET per ottenere “st”, “nd”, “rd” e “th” per i numeri?

Mi chiedo se ci sia un metodo o una stringa di formato che mi manca in .NET per convertire quanto segue:

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

Questo link ha un cattivo esempio del principio di base coinvolto nello scrivere la propria funzione, ma sono più curioso se c’è una capacità intrinseca che mi manca.

Soluzione

La risposta di Scott Hanselman è accettata perché risponde direttamente alla domanda.

Per una soluzione, tuttavia, vedere questa grande risposta .

No, non è presente alcuna funzionalità incorporata nella libreria di classi base .NET.

È una funzione molto più semplice di quanto pensi. Sebbene possa esistere già una funzione .NET per questo, la funzione seguente (scritta in PHP) fa il lavoro. Non dovrebbe essere troppo difficile portarlo sopra.

 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: Ecco la funzione PHP in C #:

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

Semplice, pulito, veloce

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

O meglio ancora, come metodo di estensione

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

Ora puoi solo chiamare

 int a = 1; a.DisplayWithSuffix(); 

o anche direttamente come

 1.DisplayWithSuffix(); 

Questo è già stato coperto, ma non sono sicuro su come collegarlo. Ecco lo snippit del codice:

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

Cordiali saluti: questo è un metodo di estensione. Se la tua versione .NET è inferiore a 3.5, rimuovi la parola chiave

[EDIT]: Grazie per aver indicato che non era corretto, questo è ciò che ottieni per il codice copia / incolla 🙂

Ecco una versione della funzione Microsoft SQL Server:

 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 

So che questa non è una risposta alla domanda dell’OP, ma poiché ho trovato utile sollevare la funzione SQL Server da questo thread, ecco un equivalente 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; 

Does …, -1st, 0th ha senso?

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

Un altro sapore:

 ///  /// Extension methods for numbers ///  public static class NumericExtensions { ///  /// Adds the ordinal indicator to an integer ///  /// The number /// The formatted number 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 "<<"["< 

Penso che il suffisso ordinale sia difficile da ottenere … in pratica devi scrivere una funzione che usa un interruttore per testare i numeri e aggiungere il suffisso.

Non c’è motivo per una lingua di fornire questo internamente, specialmente quando è specifico per la lingua.

Puoi fare un po ‘meglio di quel link quando si tratta della quantità di codice da scrivere, ma devi codificare una funzione per questo …