Як ви відформатуєте день місяця, щоб сказати "11-й", "21-й" або "23-й" (порядковий індикатор)?


146

Я знаю , що це дасть мені день місяця як число ( 11, 21, 23):

SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");

Але як ви відформатуєте день місяця, щоб включити порядковий індикатор , скажімо 11th, 21stабо 23rd?


13
Для довідки вони називаються порядковими номерами - en.wikipedia.org/wiki/Ordinal_number_(linguistics) .
ocodo

5
Щодо запису, все, що будує відповідь, замість того, щоб шукати всю відповідь у таблиці, близьке до неможливості локалізації на інших мовах.
Thorbjørn Ravn Andersen

2
Відповідь якимось чином неправильна, подивіться на мою відповідь плз.
J888

2
Сучасний коментар: рекомендую уникати SimpleDateFormatзанять. Це не тільки давно застаріло, але й сумно клопітно. Сьогодні ми набагато краще java.timeвживаємо сучасний API дати та часу Java та його DateTimeFormatter.
Оле ВВ

Погляньте на API чисел ( math.tools/api/numbers ). Він має підтримку порядкового, кардинального, числа, викладеного різною мовою, написаного як валюта на різних мовах тощо.
dors

Відповіді:


181
// https://github.com/google/guava
import static com.google.common.base.Preconditions.*;

String getDayOfMonthSuffix(final int n) {
    checkArgument(n >= 1 && n <= 31, "illegal day of month: " + n);
    if (n >= 11 && n <= 13) {
        return "th";
    }
    switch (n % 10) {
        case 1:  return "st";
        case 2:  return "nd";
        case 3:  return "rd";
        default: return "th";
    }
}

Таблиця від @kaliatech приємна, але оскільки повторюється та сама інформація, вона відкриває шанс для помилки. Така помилка насправді існує в таблиці для 7tn, 17tnі 27tn(ця помилка може виправлятися з плином часу через текучу природу StackOverflow, тому перевірте історію версій у відповіді, щоб побачити помилку).


36
це насправді відчуває нагляд у простому форматі даних, чи не так?
stevevls

51
Веселіться, інтернаціоналізуючи це. : D
Трейказ

6
@Trejkaz Поза межами питання :)
Грег Маттес

3
Це рішення підтримує лише англійську мову. Використовуйте RuleBasedNumberFormat від ICU4J для локалізованого рішення.
Дмитро Яковлєв

7
Ви, хлопці, в бур'яні, і тон трохи повороту. Не потрібно в цьому. Це питання не задавало тонкощів інтернаціоналізації. Інтернаціоналізація - це, безумовно, чудова тема, яку потрібно обговорити, але це слід зробити з іншого питання з таким фокусом. Я завжди тлумачив це питання як прохання про швидкий і брудний спосіб досягти цього англійською мовою. Отже, я пропоную, якщо в світі Java немає хорошого рішення, яке є інтернаціоналізацією, то ми починаємо проект, наприклад, GitHub і створюємо хороше рішення. Повідомте мене, якщо вам цікаво.
Грег Маттес

51

У JDK немає нічого для цього.

  static String[] suffixes =
  //    0     1     2     3     4     5     6     7     8     9
     { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th",
  //    10    11    12    13    14    15    16    17    18    19
       "th", "th", "th", "th", "th", "th", "th", "th", "th", "th",
  //    20    21    22    23    24    25    26    27    28    29
       "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th",
  //    30    31
       "th", "st" };

 Date date = new Date();
 SimpleDateFormat formatDayOfMonth  = new SimpleDateFormat("d");
 int day = Integer.parseInt(formatDateOfMonth.format(date));
 String dayStr = day + suffixes[day];

Або за допомогою календаря:

 Calendar c = Calendar.getInstance();
 c.setTime(date);
 int day = c.get(Calendar.DAY_OF_MONTH);
 String dayStr = day + suffixes[day];

За коментарями @ thorbjørn-ravn-andersen, подібна таблиця може бути корисною при локалізації:

  static String[] suffixes =
     {  "0th",  "1st",  "2nd",  "3rd",  "4th",  "5th",  "6th",  "7th",  "8th",  "9th",
       "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th",
       "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th",
       "30th", "31st" };

8
Якщо ви дозволите, щоб таблиця містила повні "21", "23", "29", вона може бути екстерналізована та локалізована на інших мовах. Для успішного програмного забезпечення, яке може стати вимогою.
Thorbjørn Ravn Andersen

40
private String getCurrentDateInSpecificFormat(Calendar currentCalDate) {
    String dayNumberSuffix = getDayNumberSuffix(currentCalDate.get(Calendar.DAY_OF_MONTH));
    DateFormat dateFormat = new SimpleDateFormat(" d'" + dayNumberSuffix + "' MMMM yyyy");
    return dateFormat.format(currentCalDate.getTime());
}

private String getDayNumberSuffix(int day) {
    if (day >= 11 && day <= 13) {
        return "th";
    }
    switch (day % 10) {
    case 1:
        return "st";
    case 2:
        return "nd";
    case 3:
        return "rd";
    default:
        return "th";
    }
}

Я просто спробував ваше рішення, опустивши одинарні лапки в рядку шаблону, наданому конструктору SimpleDateFormat. Тепер я бачу, чому вони там. Я отримую з- java.lang.IllegalArgumentExceptionза "незаконного характеру візерунка, т."
типовий данни

17

Питання мало старе. Оскільки це питання дуже шумно, тому розміщую те, що я вирішив статичним методом як утиліту. Просто скопіюйте, вставте та використовуйте!

 public static String getFormattedDate(Date date){
            Calendar cal=Calendar.getInstance();
            cal.setTime(date);
            //2nd of march 2015
            int day=cal.get(Calendar.DATE);

            if(!((day>10) && (day<19)))
            switch (day % 10) {
            case 1:  
                return new SimpleDateFormat("d'st' 'of' MMMM yyyy").format(date);
            case 2:  
                return new SimpleDateFormat("d'nd' 'of' MMMM yyyy").format(date);
            case 3:  
                return new SimpleDateFormat("d'rd' 'of' MMMM yyyy").format(date);
            default: 
                return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
        }
        return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
    }

Для тестування пурози

Приклад: виклик його з основного методу!

Date date = new Date();
        Calendar cal=Calendar.getInstance();
        cal.setTime(date);
        for(int i=0;i<32;i++){
          System.out.println(getFormattedDate(cal.getTime()));
          cal.set(Calendar.DATE,(cal.getTime().getDate()+1));
        }

Вихід:

22nd of February 2018
23rd of February 2018
24th of February 2018
25th of February 2018
26th of February 2018
27th of February 2018
28th of February 2018
1st of March 2018
2nd of March 2018
3rd of March 2018
4th of March 2018
5th of March 2018
6th of March 2018
7th of March 2018
8th of March 2018
9th of March 2018
10th of March 2018
11th of March 2018
12th of March 2018
13th of March 2018
14th of March 2018
15th of March 2018
16th of March 2018
17th of March 2018
18th of March 2018
19th of March 2018
20th of March 2018
21st of March 2018
22nd of March 2018
23rd of March 2018
24th of March 2018
25th of March 2018

16
String ordinal(int num)
{
    String[] suffix = {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"};
    int m = num % 100;
    return String.valueOf(num) + suffix[(m > 3 && m < 21) ? 0 : (m % 10)];
}

14

Мені б хотілося внести сучасну відповідь. SimpleDateFormatКлас був нормально використовувати , коли питання було поставлене 8 років тому, але ви повинні уникати його зараз , як це не тільки давно застаріли, а й як відомо , клопітка. Використовуйте java.timeзамість цього.

Редагувати

DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)відмінно підходить для цієї мети. Використовуючи його, ми будуємо форматер, який виконує нашу роботу:

    Map<Long, String> ordinalNumbers = new HashMap<>(42);
    ordinalNumbers.put(1L, "1st");
    ordinalNumbers.put(2L, "2nd");
    ordinalNumbers.put(3L, "3rd");
    ordinalNumbers.put(21L, "21st");
    ordinalNumbers.put(22L, "22nd");
    ordinalNumbers.put(23L, "23rd");
    ordinalNumbers.put(31L, "31st");
    for (long d = 1; d <= 31; d++) {
        ordinalNumbers.putIfAbsent(d, "" + d + "th");
    }

    DateTimeFormatter dayOfMonthFormatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.DAY_OF_MONTH, ordinalNumbers)
            .appendPattern(" MMMM")
            .toFormatter();

    LocalDate date = LocalDate.of(2018, Month.AUGUST, 30);
    for (int i = 0; i < 6; i++) {
        System.out.println(date.format(dayOfMonthFormatter));
        date = date.plusDays(1);
    }

Вихід з цього фрагмента:

30th August
31st August
1st September
2nd September
3rd September
4th September

Стара відповідь

Цей код коротший, але IMHO не такий елегантний.

    // ordinal indicators by numbers (1-based, cell 0 is wasted)
    String[] ordinalIndicators = new String[31 + 1];
    Arrays.fill(ordinalIndicators, 1, ordinalIndicators.length, "th");
    ordinalIndicators[1] = ordinalIndicators[21] = ordinalIndicators[31] = "st";
    ordinalIndicators[2] = ordinalIndicators[22] = "nd";
    ordinalIndicators[3] = ordinalIndicators[23] = "rd";

    DateTimeFormatter dayOfMonthFormatter = DateTimeFormatter.ofPattern("d");

    LocalDate today = LocalDate.now(ZoneId.of("America/Menominee")).plusWeeks(1);
    System.out.println(today.format(dayOfMonthFormatter) 
                        + ordinalIndicators[today.getDayOfMonth()]);

Запуск цього фрагмента зараз я отримав

23-й

Однією з багатьох особливостей java.timeє те, що день місяця просто та надійно зрозуміти як місяць int, який, очевидно, необхідний для вибору потрібного суфікса зі столу.

Я також рекомендую написати одиничний тест.

PS Аналогічний форматіровщік також може бути використаний для розбору рядка дати , що містить порядкові номери , як 1st, 2ndі т.д. Це було зроблено в цьому питанні: Java - дата синтаксичні з необов'язковими секундами .

Посилання: Підручник Oracle: Час дати, що пояснює, як користуватися java.time.


Буде радий отримати цю відповідь вище, оскільки ця більш сучасна відповідь є кращою, ніж намагатися розгорнути власну реалізацію.
Креаз

9

Якщо ви спробуєте бути обізнаними про i18n, рішення стає ще складнішим.

Проблема полягає в тому, що в інших мовах суфікс може залежати не тільки від самої кількості, але і від іменника, який він нараховує. Наприклад, російською мовою це було б "2-ой день", але "2-ая неделя" (вони означають "2-й день", але "2-й тиждень"). Це не застосовується, якщо ми форматуємо лише кілька днів, але в трохи більш загальному випадку ви повинні знати про складність.

Я думаю, що приємним рішенням (я не встиг реально реалізувати) було б розширити SimpleDateFormetter, щоб застосувати відомий Locale MessageFormat перед переходом до батьківського класу. Таким чином, ви зможете підтримати, скажімо, для березеньських форматів% M отримати "3-ту",% MM отримати "03-ту" і% MMM отримати "третю". Зовні цей клас виглядає як звичайний SimpleDateFormatter, але підтримує більше форматів. Також якщо цей шаблон буде помилково застосований звичайним SimpleDateFormetter, результат буде неправильно відформатований, але все ще читабельний.


Хороша думка про гендери російською мовою, але технічно це зробить неможливим% MMM без додаткового контексту.
Божевільний фізик

@Mad Physicist, це неправда, оскільки% MMM застосовуватиметься до місяця, тому ми знаємо іменник, що зв'язався.
CAB

6

Багато прикладів тут не працюватимуть для 11, 12, 13. Це більш загальне і буде працювати для всіх випадків.

switch (date) {
                case 1:
                case 21:
                case 31:
                    return "" + date + "st";

                case 2:
                case 22:
                    return "" + date + "nd";

                case 3:
                case 23:
                    return "" + date + "rd";

                default:
                    return "" + date + "th";
}

5

Мене не можуть задовольнити відповіді, що вимагають рішення лише для англійської мови, заснованого на ручних форматах. Я деякий час шукав правильного рішення і, нарешті, знайшов його.

Ви повинні використовувати RuleBasedNumberFormat . Це прекрасно працює, і це шанобливо до Locale.


3

Існує простіший і впевнений спосіб зробити це. Функція, яку вам потрібно буде використовувати, - getDateFromDateString (dateString); В основному він видаляє st / nd / rd / th від рядка дати та просто аналізує його. Ви можете змінити свій SimpleDateFormat на будь-що, і це спрацює.

public static final SimpleDateFormat sdf = new SimpleDateFormat("d");
public static final Pattern p = Pattern.compile("([0-9]+)(st|nd|rd|th)");

private static Date getDateFromDateString(String dateString) throws ParseException {
     return sdf.parse(deleteOrdinal(dateString));
}

private static String deleteOrdinal(String dateString) {
    Matcher m = p.matcher(dateString);
    while (m.find()) {
        dateString = dateString.replaceAll(Matcher.quoteReplacement(m.group(0)), m.group(1));
    }
    return dateString;

}


1
Ця відповідь стосується розбору рядка, а питання - про створення рядка. Але все-таки доречно, оскільки один, ймовірно, потребує обох напрямків. Також ця відповідь вирішує це інше питання .
Василь Бурк

3

Єдине питання щодо рішення, яке надає Грег, полягає в тому, що воно не враховує число, що перевищує 100, із закінченням номерів "підлітка". Наприклад, 111 має бути 111-м, а не 111-м. Це моє рішення:

/**
 * Return ordinal suffix (e.g. 'st', 'nd', 'rd', or 'th') for a given number
 * 
 * @param value
 *           a number
 * @return Ordinal suffix for the given number
 */
public static String getOrdinalSuffix( int value )
{
    int hunRem = value % 100;
    int tenRem = value % 10;

    if ( hunRem - tenRem == 10 )
    {
        return "th";
    }
    switch ( tenRem )
    {
    case 1:
        return "st";
    case 2:
        return "nd";
    case 3:
        return "rd";
    default:
        return "th";
    }
}

6
У якому випадку послідовність Дня місяця матиме більше 31 дня ??
SatanEnglish

@SatanEnglish, добре про цей статичний заводський метод полягає в тому, що його можна використовувати більше, ніж просто отримувати суфікс місяця. :)
Джаред Румлер

1
Цей метод повертає st для 11,
другого

@SatanEnglish. Зважаючи на те, що сьогодні 13 лютого в моєму календарі вибору, я думаю, що ваше питання дає відповідь само собою. Якщо серйозно, негрегоріанських календарів є багато, якщо ви знаєте, де шукати.
Божевільний фізик

Ні, @ THEIT, це не так. Я тестував. Він повертається thза 11, 12 і 13 як слід. Я вважаю, що if ( hunRem - tenRem == 10 )справа впевнена, що це і є.
Оле ВВ

2

RuleBasedNumberFormat в бібліотеці ICU

Я високо оцінив посилання на бібліотеку проекту ICU від @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ), проте все-таки довелося зрозуміти як використовувати його, на прикладіRuleBasedNumberFormat використання наведено нижче.

Він буде форматувати лише одне число, а не всю дату, тому вам потрібно буде скласти комбінований рядок, якщо шукати дату у форматі: наприклад, понеділок 3 лютого.

Наведений нижче код встановлює RuleBasedNumberFormatяк ординальний формат для заданої локальної точки, створюєjava.time ZonedDateTime , а потім форматує число з його порядковим рядком.

RuleBasedNumberFormat numOrdinalFormat = new RuleBasedNumberFormat(Locale.UK,
    RuleBasedNumberFormat.ORDINAL);
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Pacific/Auckland"));

String dayNumAndOrdinal = numOrdinalFormat.format(zdt.toLocalDate().getDayOfMonth());

Приклад виводу:

3-й

Або

4-й

тощо.


1

Ось підхід, який оновлює шаблон DateTimeFormatter з правильним суфіксом буквальним, якщо він знаходить шаблон d'00', наприклад, для дня першого місяця він буде замінений на d'st'. Після того, як шаблон буде оновлено, його можна буде просто подати в DateTimeFormatter, щоб зробити все інше.

private static String[] suffixes = {"th", "st", "nd", "rd"};

private static String updatePatternWithDayOfMonthSuffix(TemporalAccessor temporal, String pattern) {
    String newPattern = pattern;
    // Check for pattern `d'00'`.
    if (pattern.matches(".*[d]'00'.*")) {
        int dayOfMonth = temporal.get(ChronoField.DAY_OF_MONTH);
        int relevantDigits = dayOfMonth < 30 ? dayOfMonth % 20 : dayOfMonth % 30;
        String suffix = suffixes[relevantDigits <= 3 ? relevantDigits : 0];
        newPattern = pattern.replaceAll("[d]'00'", "d'" + suffix + "'");
    }

    return newPattern;
}

Це вимагає оновлення оригінального шаблону безпосередньо перед кожним викликом форматування, наприклад

public static String format(TemporalAccessor temporal, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(updatePatternWithDayOfMonthSuffix(temporal, pattern));
    return formatter.format(temporal);
}

Тож це корисно, якщо шаблон форматування визначений поза кодом Java, наприклад, шаблон, де, як ніби ви можете визначити шаблон у Java, то відповідь від @ OleV.V. може бути більш підходящим


1
Творчі та вивернуті. Звичайно, мені знадобилося багато часу, щоб зрозуміти, як це працює. Це не ознака хорошого коду.
Оле ВВ

1
@ OleV.V. THX для зворотного зв'язку - я її трохи реструктурував, так що це трохи менше багатослівного. Щойно побачив ваш підхід і мені це подобається! Я думаю, що обидва підходи справедливі при різних угодах. Вам не потрібна додаткова підтримка в точці форматування, але вимагає, щоб шаблон був визначений за допомогою конструктора, який виключає визначення шаблону в неводному коді Java. Мій підхід вимагає додаткової підтримки в точці форматування, але відсутність залежності від будівельника для створення шаблону робить його трохи більш гнучким, де можна визначити шаблон. Мої вимоги продиктували останнє
tazmaniax

3
Дуже приємний рахунок плюсів і мінусів. Ви можете включити його у відповідь? Просто ідея.
Оле ВВ

1

Я написав собі метод помічників, щоб отримати зразки для цього.

public static String getPattern(int month) {
    String first = "MMMM dd";
    String last = ", yyyy";
    String pos = (month == 1 || month == 21 || month == 31) ? "'st'" : (month == 2 || month == 22) ? "'nd'" : (month == 3 || month == 23) ? "'rd'" : "'th'";
    return first + pos + last;
}

і тоді ми можемо назвати це як

LocalDate localDate = LocalDate.now();//For reference
int month = localDate.getDayOfMonth();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(getPattern(month));
String date = localDate.format(formatter);
System.out.println(date);

вихід є

December 12th, 2018

Для цього потрібен мінімум API 26:
Міккель Ларсен

@MikkelLarsen це питання стосувалося не андроїда, я використовував для цього Java 8. Android не підтримує великий api для Java 8
SamHoque

@SamSakerz my bad :)
Міккель Ларсен

@MikkelLarsen Більшість функцій java.time повертається до Java 6 та Java 7 у проекті ThreeTen-Backport . Крім того, адаптований до попереднього Android (<26) у ThreeTenABP . Див. Як користуватися ThreeTenABP… .
Василь Бурк

1

Спробуйте нижче функцію:

public static String getFormattedDate(Date date) 
{
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  //2nd of march 2015
  int day = cal.get(Calendar.DATE);
  if (!((day > 10) && (day < 19)))
   switch (day % 10) {
    case 1:
     return new SimpleDateFormat("d'st' 'of' MMMM yyyy").format(date);
    case 2:
     return new SimpleDateFormat("d'nd' 'of' MMMM yyyy").format(date);
    case 3:
     return new SimpleDateFormat("d'rd' 'of' MMMM yyyy").format(date);
    default:
     return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
   }
  return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
}

Відповідаючи на старе запитання, ваша відповідь буде набагато кориснішою для інших користувачів StackOverflow, якщо ви включили якийсь контекст, щоб пояснити, як допомагає ваша відповідь, особливо на питання, на яке вже є прийнята відповідь. Див.: Як написати гарну відповідь .
Девід Бак

Дякуємо, що хочете зробити свій внесок. Я рекомендую не використовувати Date, Calendarі SimpleDateFormat. Ці класи погано розроблені та давно застарілі, останній, зокрема, гостро сумний. Замість цього використовуйте LocalDateі DateTimeFormatter, як від java.time, сучасний API дати та часу Java . Також я сумніваюся, що нова ваша відповідь сприяє порівняно з іншими 18 відповідями?
Оле ВВ

0

У котліні можна використовувати так

fun changeDateFormats(currentFormat: String, dateString: String): String {
        var result = ""
        try {
            val formatterOld = SimpleDateFormat(currentFormat, Locale.getDefault())
            formatterOld.timeZone = TimeZone.getTimeZone("UTC")

            var date: Date? = null

            date = formatterOld.parse(dateString)

            val dayFormate = SimpleDateFormat("d", Locale.getDefault())
            var day = dayFormate.format(date)

            val formatterNew = SimpleDateFormat("hh:mm a, d'" + getDayOfMonthSuffix(day.toInt()) + "' MMM yy", Locale.getDefault())

            if (date != null) {
                result = formatterNew.format(date)
            }

        } catch (e: ParseException) {
            e.printStackTrace()
            return dateString
        }

        return result
    }


    private fun getDayOfMonthSuffix(n: Int): String {
        if (n in 11..13) {
            return "th"
        }
        when (n % 10) {
            1 -> return "st"
            2 -> return "nd"
            3 -> return "rd"
            else -> return "th"
        }
    }

встановити так

  txt_chat_time_me.text = changeDateFormats("SERVER_DATE", "DATE")

-3

Наступний метод може бути використаний для отримання відформатованого рядка дати, яка передається йому. Він відформатує дату, щоб сказати 1-ю, 2-ю, 3-ю, 4-ю .. за допомогою SimpleDateFormat на Java. наприклад: - 1 вересня 2015 року

public String getFormattedDate(Date date){
            Calendar cal=Calendar.getInstance();
            cal.setTime(date);
            //2nd of march 2015
            int day=cal.get(Calendar.DATE);

            switch (day % 10) {
            case 1:  
                return new SimpleDateFormat("d'st' 'of' MMMM yyyy").format(date);
            case 2:  
                return new SimpleDateFormat("d'nd' 'of' MMMM yyyy").format(date);
            case 3:  
                return new SimpleDateFormat("d'rd' 'of' MMMM yyyy").format(date);
            default: 
                return new SimpleDateFormat("d'th' 'of' MMMM yyyy").format(date);
        }

-4

Далі - більш ефективна відповідь на питання, а не жорстке кодування стилю.

Для зміни дня на порядковий номер потрібно використовувати наступний суфікс .

DD +     TH = DDTH  result >>>> 4TH

OR to spell the number add SP to the format

DD + SPTH = DDSPTH   result >>> FOURTH

Знайдіть мою завершену відповідь у цьому питанні.


Питання в тому, щоб відформатувати на Java не в базі даних Oracle docs.oracle.com/cd/B12037_01/server.101/b10759/… Java використовує SimpleDateFormat на дату: docs.oracle.com/javase/tutorial/i18n/format/…
Belal мазлом

-9
public String getDaySuffix(int inDay)
{
  String s = String.valueOf(inDay);

  if (s.endsWith("1"))
  {
    return "st";
  }
  else if (s.endsWith("2"))
  {
    return "nd";
  }
  else if (s.endsWith("3"))
  {
    return "rd";
  }
  else
  {
    return "th";
  }
}

Він не повинен використовувати кінціWith (); які дають неправильний вихід
Рахул Шарма
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.