Auf dieser Seite finden Sie eine vollständige Liste aller benutzerdefinierten numerischen Formatierungsregeln:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
Wie Sie sehen können, enthält Ordinals nichts, daher kann dies nicht mit String.Format durchgeführt werden. Es ist jedoch nicht wirklich so schwer, eine Funktion dafür zu schreiben.
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";
}
}
Update: Technisch gesehen gibt es keine Ordnungszahlen für <= 0, daher habe ich den obigen Code aktualisiert. Auch die redundanten ToString()
Methoden entfernt.
Beachten Sie auch, dass dies nicht internationalisiert ist. Ich habe keine Ahnung, wie Ordnungszahlen in anderen Sprachen aussehen.
Denken Sie an die Internationalisierung!
Die Lösungen hier funktionieren nur für Englisch. Die Dinge werden viel komplexer, wenn Sie andere Sprachen unterstützen müssen.
Zum Beispiel würde "1st" auf Spanisch als "1.o", "1.a", "1.os" oder "1.as" geschrieben, je nachdem, ob das, was Sie zählen, männlich, weiblich oder plural ist !
Wenn Ihre Software verschiedene Sprachen unterstützen muss, vermeiden Sie Ordnungszahlen.
quelle
Meine Version von Jesses Version von Stu's und Samjudson's Versionen :)
Enthaltener Komponententest, um zu zeigen, dass die akzeptierte Antwort falsch ist, wenn Nummer <1
quelle
Einfach, sauber, schnell
Oder noch besser als Erweiterungsmethode
Jetzt können Sie einfach anrufen
oder sogar so direkt wie
quelle
Sie müssen Ihre eigenen rollen. Von oben:
Sie können dann tun
Bearbeitet für Ausnahmen vom 12.11.13. Ich habe von oben gesagt :-)
Bearbeitet für 1011 - andere haben dies bereits behoben. Sie möchten nur sicherstellen, dass andere diese falsche Version nicht verwenden.
quelle
Ich mochte eher Elemente aus Stu 's und Samjudsons Lösungen und arbeitete sie zu einer meiner Meinung nach verwendbaren Kombination zusammen:
quelle
Obwohl ich dies noch nicht bewertet habe, sollten Sie in der Lage sein, eine bessere Leistung zu erzielen, indem Sie alle bedingten Fallaussagen vermeiden.
Dies ist Java, aber ein Port nach C # ist trivial:
Beachten Sie, dass die Reduzierung von Bedingungen und die Verwendung der Array-Suche die Leistung beschleunigen sollten, wenn viele Ordnungszahlen in einer engen Schleife generiert werden. Ich gebe jedoch auch zu, dass dies nicht so lesbar ist wie die Lösung für Fallanweisungen.
quelle
Ähnlich wie bei Ryans Lösung, aber noch grundlegender, verwende ich einfach ein einfaches Array und benutze den Tag, um die richtige Ordnungszahl nachzuschlagen:
Ich hatte keine Notwendigkeit, aber ich würde annehmen, dass Sie ein mehrdimensionales Array verwenden könnten, wenn Sie Unterstützung für mehrere Sprachen wünschen.
Soweit ich mich aus meiner Uni-Zeit erinnern kann, erfordert diese Methode nur minimalen Aufwand vom Server.
quelle
Ich benutze diese Erweiterungsklasse:
quelle
Angeforderte "weniger Redundanz" -Version von Samjudsons Antwort ...
quelle
public static
und es in einen mnemonischeren Namen umbenennen (dh "OrdinalSuffix"). Der Anrufer möchte möglicherweise den Nummernteil in verschiedenen Formaten (dh mit Kommas).Wenn jemand nach einem Liner sucht: p
quelle
quelle
EDIT : Wie YM_Industries im Kommentar hervorhebt , funktioniert Samjudsons Antwort für Zahlen über 1000, Nickfs Kommentar scheint verschwunden zu sein und ich kann mich nicht erinnern, was das Problem war, das ich gesehen habe. Lassen Sie diese Antwort hier für die Vergleichszeiten.
Sehr viele davon funktionieren nicht für Zahlen> 999, wie Nickf in einem Kommentar hervorhob (BEARBEITEN: jetzt fehlt).
Hier ist eine Version basierend aus einer modifizierten Version von samjudson ‚s akzeptierte Antwort , das tut.
Auch Shahzad Qureshi ‚s Antwort String - Manipulation unter Verwendung funktioniert gut, aber es ist eine Leistungseinbuße hat. Um viele davon zu generieren, macht ein LINQPad-Beispielprogramm die String-Version 6-7 mal langsamer als diese Ganzzahl (obwohl Sie viel generieren müssten, um es zu bemerken).
LINQPad-Beispiel:
quelle
Basierend auf den anderen Antworten:
quelle
FWIW, für MS-SQL erledigt dieser Ausdruck die Aufgabe. Behalten Sie das erste WHEN (
WHEN num % 100 IN (11, 12, 13) THEN 'th'
) als erstes in der Liste bei, da dies davon abhängt, dass Sie es vor den anderen versuchen.Für Excel:
Der Ausdruck
(MOD(A1-11,100)>2)
ist TRUE (1) für alle Zahlen mit Ausnahme der Endungen11,12,13
(FALSE = 0). So2 * RIGHT(A1) * (MOD(A1-11,100)>2) +1)
endet 1 für 11/12/13, andernfalls:1 ergibt 3
2 bis 5,
3 bis 7
andere: 9
- und die erforderlichen 2 Zeichen werden
"thstndrdth"
ausgehend von dieser Position ausgewählt.Wenn Sie das wirklich ziemlich direkt in SQL konvertieren möchten, hat dies für mich für eine Handvoll Testwerte funktioniert:
quelle
Dies ist die Implementierung in
dart
und kann je nach Sprache geändert werden.quelle
Zwar gibt es hier viele gute Antworten, aber ich denke, es gibt Platz für eine andere, diesmal basierend auf dem Mustervergleich, wenn nicht für irgendetwas anderes, dann zumindest für eine umstrittene Lesbarkeit
und was macht diese lösung so besonders? nichts als die Tatsache, dass ich einige Leistungsüberlegungen für verschiedene andere Lösungen hinzufüge
Ehrlich gesagt bezweifle ich, dass Leistung für dieses spezielle Szenario wirklich wichtig ist (wer wirklich die Ordnungszahlen von Millionen von Zahlen benötigt), aber zumindest zeigt es einige Vergleiche, die berücksichtigt werden müssen ...
quelle
Ein weiterer Einzeiler, jedoch ohne Vergleiche, indem nur das Regex-Ergebnis in ein Array indiziert wird.
Die PowerShell-Version kann weiter gekürzt werden:
quelle
Ein weiterer 1 Liner.
quelle
Hier ist die DateTime-Erweiterungsklasse. Kopieren, Einfügen und Genießen
öffentliche statische Klasse DateTimeExtensions {
Ergebnis:
9. Oktober 2014
quelle
Eine andere Alternative, die ich basierend auf allen anderen Vorschlägen verwendet habe, für die jedoch kein spezielles Gehäuse erforderlich ist:
quelle