Czy istnieje prosty sposób w C # na tworzenie porządków dla liczby? Na przykład:
- 1 zwraca 1. pozycję
- 2 zwraca 2. miejsce
- 3 zwraca 3. miejsce
- ...itp
Czy można to zrobić za pomocą String.Format()
czy dostępne są jakieś funkcje?
Ta strona zawiera pełną listę wszystkich niestandardowych reguł formatowania numerycznego:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
Jak widać, w porządkach nie ma nic, więc nie można tego zrobić za pomocą String.Format. Jednak nie jest tak trudno napisać funkcję, aby to zrobić.
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";
}
}
Aktualizacja: Techniczne porządki nie istnieją dla <= 0, więc zaktualizowałem powyższy kod. Usunięto także zbędne ToString()
metody.
Należy również pamiętać, że nie jest to internacjonalizowane. Nie mam pojęcia, jak wyglądają porządki w innych językach.
Pamiętaj o internacjonalizacji!
Rozwiązania tutaj działają tylko w języku angielskim. Sprawy stają się znacznie bardziej złożone, jeśli potrzebujesz obsługi innych języków.
Na przykład w języku hiszpańskim „1.” byłoby napisane jako „1.o”, „1.a”, „1.os” lub „1.as” w zależności od tego, czy liczysz coś męskiego, żeńskiego czy mnogiego !
Więc jeśli twoje oprogramowanie musi obsługiwać różne języki, staraj się unikać porządków.
źródło
Moja wersja wersji Jesse'a Stu i wersji Samjudson :)
Uwzględniono test jednostkowy, aby wykazać, że zaakceptowana odpowiedź jest niepoprawna, gdy liczba <1
źródło
Prosto, czysto, szybko
Lub jeszcze lepiej, jako metoda rozszerzenia
Teraz możesz po prostu zadzwonić
lub nawet tak bezpośredni jak
źródło
Musisz rzucić własne. Z czubka głowy:
Możesz wtedy zrobić
Edytowano dla wyjątków 11.12.2013. Powiedziałem z góry :-)
Edycja dla 1011 - inni już to naprawili, po prostu upewnij się, że inni nie pobiorą tej niepoprawnej wersji.
źródło
Raczej podobały mi się elementy z rozwiązań Stu i samjudson i połączyłem je w coś, co moim zdaniem jest użyteczną kombinacją:
źródło
Chociaż nie przeprowadziłem jeszcze testu porównawczego, powinieneś być w stanie uzyskać lepszą wydajność, unikając wszystkich instrukcji warunkowych.
To jest Java, ale port do C # jest trywialny:
Zwróć uwagę, że ograniczenie warunkowe i użycie wyszukiwania tablicowego powinno przyspieszyć wydajność, jeśli generujesz wiele rzędnych w ciasnej pętli. Przyznaję jednak, że nie jest to tak czytelne jak rozwiązanie instrukcji case.
źródło
Podobne do rozwiązania Ryana, ale nawet bardziej podstawowe, po prostu używam prostej tablicy i używam dnia, aby wyszukać poprawną liczbę porządkową:
Nie miałem takiej potrzeby, ale zakładam, że możesz użyć wielowymiarowej tablicy, jeśli chcesz mieć obsługę wielu języków.
Z tego, co pamiętam z czasów Uni, ta metoda wymaga minimalnego wysiłku ze strony serwera.
źródło
Używam tej klasy rozszerzenia:
źródło
Żądano wersji „mniej redundancji” odpowiedzi samjudson ...
źródło
public static
i zmieniłem jego nazwę na bardziej mnemoniczną nazwę (tj. „OrdinalSuffix”). Dzwoniący może chcieć, aby część liczbowa była w różnych formatach (np. Przecinkami).Jeśli ktoś szuka jednej wkładki: str
źródło
źródło
EDYCJA : Jak zauważa YM_Industries w komentarzu, odpowiedź samjudsona DZIAŁA dla liczb powyżej 1000, wydaje się, że komentarz Nickfa zniknął i nie pamiętam, jaki był problem. Pozostaw tę odpowiedź tutaj dla czasów porównania.
Okropnie wiele z nich nie działa dla liczb> 999, jak nick zauważył w komentarzu (EDYCJA: teraz brakuje).
Oto wersja oparta na zmodyfikowanej wersji zaakceptowanej odpowiedzi samjudsona , która spełnia.
Również Shahzad Qureshi „s odpowiedź za pomocą manipulacji ciąg działa dobrze, jednak ma spadku wydajności. Aby wygenerować wiele z nich, przykładowy program LINQPad sprawia, że wersja łańcucha jest 6-7 razy wolniejsza niż ta liczba całkowita (chociaż trzeba by generować dużo, aby zauważyć).
Przykład LINQPad:
źródło
Na podstawie innych odpowiedzi:
źródło
FWIW, dla MS-SQL, to wyrażenie wykona zadanie. Zachowaj pierwszy WHEN (
WHEN num % 100 IN (11, 12, 13) THEN 'th'
) jako pierwszy na liście, ponieważ zależy to od wypróbowania go przed innymi.W przypadku programu Excel:
Wyrażenie
(MOD(A1-11,100)>2)
ma wartość PRAWDA (1) dla wszystkich liczb z wyjątkiem każdego kończącego się na11,12,13
(FAŁSZ = 0). Tak więc2 * RIGHT(A1) * (MOD(A1-11,100)>2) +1)
kończy się jako 1 na 11.12.2013, w przeciwnym razie:1 ocenia na 3
2 do 5,
3 do 7
innych: 9
- i wymagane 2 znaki są wybierane
"thstndrdth"
z tej pozycji.Jeśli naprawdę chcesz przekonwertować to dość bezpośrednio na SQL, działało to dla mnie dla kilku wartości testowych:
źródło
Jest to implementacja
dart
i może być modyfikowana zgodnie z językiem.źródło
Chociaż jest tu wiele dobrych odpowiedzi, myślę, że jest miejsce na inną, tym razem opartą na dopasowaniu wzorców, jeśli nie na niczym innym, to przynajmniej na dyskusyjną czytelność
a co wyróżnia to rozwiązanie? nic poza faktem, że dodałem rozważania dotyczące wydajności dla różnych innych rozwiązań
szczerze mówiąc, wątpię, czy wydajność naprawdę ma znaczenie w tym konkretnym scenariuszu (który naprawdę potrzebuje porządków milionów liczb), ale przynajmniej przedstawia pewne porównania, które należy wziąć pod uwagę ...
źródło
Kolejny jednowierszowy, ale bez porównań tylko poprzez indeksowanie wyniku wyrażenia regularnego do tablicy.
Wersję PowerShell można dodatkowo skrócić:
źródło
Kolejna 1 wkładka.
źródło
Oto klasa DateTime Extension. Kopiuj, wklej i ciesz się
publiczna klasa statyczna DateTimeExtensions {
Wynik:
9 października 2014 r
źródło
Kolejna alternatywa, której użyłem na podstawie wszystkich innych sugestii, ale nie wymaga specjalnej obudowy:
źródło