Есть ли простой способ в C # создать Ordinals для числа? Например:
- 1 возвращается 1
- 2 возвращается 2
- 3 возвращается 3
- ...и т.д
Можно ли это сделать с помощью String.Format()
или есть какие-либо функции, доступные для этого?
На этой странице представлен полный список всех пользовательских правил числового форматирования:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
Как видите, там нет ничего об ординалах, так что это нельзя сделать с помощью String.Format. Однако не так уж сложно написать функцию для этого.
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";
}
}
Обновление: Технически Ordinals не существует для <= 0, поэтому я обновил код выше. Также удалены избыточные ToString()
методы.
Также обратите внимание, что это не интернационализировано. Я понятия не имею, как выглядят ординалы на других языках.
Помните интернационализацию!
Решения здесь работают только для английского языка. Все становится намного сложнее, если вам нужно поддерживать другие языки.
Например, на испанском языке «1-й» будет записываться как «1.o», «1.a», «1.os» или «1.as» в зависимости от того, что вы считаете - мужское, женское или множественное число. !
Поэтому, если ваше программное обеспечение должно поддерживать разные языки, старайтесь избегать порядковых.
источник
Моя версия Джесси версии Стю и Самджудсона :)
Включен модульный тест, чтобы показать, что принятый ответ неверен, когда число <1
источник
Просто, чисто, быстро
Или еще лучше, как метод расширения
Теперь вы можете просто позвонить
или даже прямой
источник
Вы должны будете катиться самостоятельно. С макушки моей головы:
Вы можете сделать
Отредактировано для исключений 11/12/13. Я СКАЗАЛ от макушки головы :-)
Отредактированный для 1011 - другие уже исправили это, только хотят удостовериться, что другие не берут эту неправильную версию.
источник
Мне скорее понравились элементы из решений Стю и Самджудсона , и я объединил их в то, что я считаю полезной комбинацией:
источник
Хотя я еще не тестировал этот уровень, вы сможете добиться лучшей производительности, избегая всех условных операторов.
Это Java, но порт для C # тривиален:
Обратите внимание, что сокращение условных выражений и использование поиска в массиве должно повысить производительность, если генерировать много порядковых чисел в узком цикле. Тем не менее, я также признаю, что это не так легко читается, как решение для случая.
источник
Подобно решению Райана, но даже более простому, я просто использую простой массив и использую день, чтобы найти правильный порядковый номер:
У меня не было необходимости, но я бы предположил, что вы могли бы использовать многомерный массив, если вы хотите иметь поддержку нескольких языков.
Из того, что я помню из моих дней Uni, этот метод требует минимальных усилий со стороны сервера.
источник
Я использую этот класс расширения:
источник
Запрашиваемая версия ответа Самджудсона "менее избыточна" ...
источник
public static
и переименовал бы его в более мнемоническое имя (то есть «OrdinalSuffix»). Вызывающая сторона может хотеть номерную часть в разных форматах (например, с запятыми).Если кто ищет один лайнер: p
источник
источник
РЕДАКТИРОВАТЬ : Как отмечает YM_Industries в комментарии, ответ Самджудсона работает для чисел свыше 1000, комментарии Никфа, похоже, исчезли, и я не могу вспомнить, в чем заключалась проблема, которую я видел. Оставьте этот ответ здесь для сравнения времени.
Очень многие из них не работают для чисел> 999, как указал Никф в комментарии (EDIT: теперь отсутствует).
Вот версия , основанная от модифицированной версии samjudson «ы общепринятый ответ , что делает.
Также Шахзад Куреши «S ответ с помощью манипуляций со строками работает отлично, однако у него есть снижение производительности. Для генерации многих из них пример программы LINQPad делает строковую версию в 6-7 раз медленнее, чем эта целочисленная (хотя вам придется генерировать много, чтобы заметить).
Пример LINQPad:
источник
Исходя из других ответов:
источник
Хотя здесь есть много хороших ответов, я думаю, что есть место для другого, на этот раз на основе сопоставления с образцом, если не для чего-то еще, то, по крайней мере, для дискуссионной читабельности
и что делает это решение особенным? ничего, кроме того факта, что я добавляю некоторые соображения производительности для различных других решений
Честно говоря, я сомневаюсь, что производительность действительно имеет значение для этого конкретного сценария (кому действительно нужны порядковые числа миллионов чисел), но, по крайней мере, это вызывает некоторые сравнения, которые необходимо учитывать ...
источник
FWIW, для MS-SQL это выражение сделает работу. Оставьте первый WHEN (
WHEN num % 100 IN (11, 12, 13) THEN 'th'
) первым в списке, так как это зависит от того, будут ли его судить раньше других.Для Excel:
Выражение
(MOD(A1-11,100)>2)
TRUE (1) для всех чисел, кроме концов, заканчивающихся на11,12,13
(FALSE = 0). Таким образом,2 * RIGHT(A1) * (MOD(A1-11,100)>2) +1)
заканчивается 1 на 11/12/13, в противном случае:1 оценивает до 3
2 до 5, от
3 до 7
других: 9
- и необходимые 2 символа выбираются из
"thstndrdth"
начиная с этой позиции.Если вы действительно хотите преобразовать это непосредственно в SQL, это сработало для меня для нескольких тестовых значений:
источник
Это реализация в
dart
и может быть изменена в зависимости от языка.источник
Еще один однострочный, но без сравнений путем индексации только результата регулярного выражения в массив.
Версия PowerShell может быть сокращена в дальнейшем:
источник
Еще 1 лайнер.
источник
Вот класс Расширения DateTime. Скопируйте, вставьте и наслаждайтесь
открытый статический класс DateTimeExtensions {
Результат:
9 октября 2014 г.
источник
Другая альтернатива, которую я использовал, основана на всех других предложениях, но не требует специального корпуса:
источник