Форматирование с учётом локали
Форматируйте числа, даты и валюты с учётом локали.
«Форматирование с учётом локали» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Числа не универсальны
Число один миллион двести тысяч в US записывается как 1,200,000.50, в Германии — как 1.200.000,50, а в Индии — как 12,00,000.50. Если жёстко задать разделители или форматы, приложение будет неправильно работать для большей части мира. API Swift FormatStyle корректно обрабатывает это для каждой локали.
import Foundation
let value = 1_200_000.5
print(value.formatted()) // uses current localeТочка входа formatted()
У большинства стандартных типов — чисел, дат, измерений и списков — есть метод formatted(). Без аргументов он использует разумные значения по умолчанию с учётом локали; передайте формат, чтобы настроить результат.
import Foundation
let n = 1234.567
print(n.formatted()) // default
print(n.formatted(.number.precision(.fractionLength(2))))Форматы чисел
.number — основной рабочий инструмент. С его помощью можно последовательно настроить группировку разрядов, количество дробных знаков, округление и отображение знака. Фактические символы-разделители по-прежнему определяет локаль.
import Foundation
let x = 1234.5
print(x.formatted(
.number
.grouping(.automatic)
.precision(.fractionLength(0...2))))Форматирование валюты
Для денежных значений .currency(code:) правильно размещает символ валюты, разделители разрядов и десятичные знаки в соответствии с локалью. Одна и та же сумма отображается как $1,200.00 или 1.200,00 €€ в зависимости от региона пользователя — никогда не создавайте строки валюты вручную.
import Foundation
let price = 1200.0
print(price.formatted(.currency(code: "USD")))
print(price.formatted(.currency(code: "EUR")))
print(price.formatted(.currency(code: "JPY")))Форматирование процентов
.percent умножает значение на 100 и добавляет знак процента, принятый в локали, учитывая правила расстановки пробелов, которые требуются в некоторых языках.
import Foundation
let ratio = 0.875
print(ratio.formatted(.percent))
print(ratio.formatted(.percent.precision(.fractionLength(1))))Переопределение локали
По умолчанию форматирование использует Locale.current. Чтобы принудительно выбрать определённую локаль — например, для проверки или отображения значения в фиксированном регионе — добавьте .locale(_:) к любому формату.
import Foundation
let value = 1234567.89
let german = Locale(identifier: "de_DE")
print(value.formatted(.number.locale(german)))
// 1.234.567,89Форматирование дат
Для дат есть собственные форматы. .dateTime позволяет составить нужный набор полей (год, месяц, день, час), а система расположит их согласно локали: месяц-день-год в US и день-месяц-год в большей части Европы.
import Foundation
let now = Date()
print(now.formatted(
.dateTime.year().month().day()))
print(now.formatted(date: .long, time: .shortened))Относительные даты
RelativeDateTimeFormatter и формат .relative создают полностью переведённые фразы вроде «2 часа назад» или «через 3 дня». Это удобно для лент и временных меток.
import Foundation
let past = Date().addingTimeInterval(-3600)
let text = past.formatted(
.relative(presentation: .named))
print(text) // e.g. "1 hour ago"Измерения и единицы
Measurement форматирует физические величины и может преобразовывать единицы измерения. Локаль определяет, показывать ли километры или мили, а формат локализует само название единицы.
import Foundation
let distance = Measurement(value: 5, unit: UnitLength.kilometers)
print(distance.formatted())
print(distance.formatted(
.measurement(width: .wide)))Списки и имена
Даже объединение элементов учитывает особенности языка. .list(type:) создаёт строку «apples, oranges, and pears» на английском и использует правильный союз и разделители в других языках — не вставляйте запятые и слово «и» вручную.
import Foundation
let fruits = ["apples", "oranges", "pears"]
print(fruits.formatted(.list(type: .and)))
print(fruits.formatted(.list(type: .or)))Обратный разбор
Форматы FormatStyles обратимы. Свойство parseStrategy формата (или инициализация значения из строки с помощью формата) преобразует локализованный текст обратно в число или дату, соблюдая те же правила локали.
import Foundation
let style = Decimal.FormatStyle.Currency(code: "USD")
let amount = try? Decimal("$1,234.50", format: style)
print(amount ?? 0)Быстрая проверка
Вспомните, какой инструмент нужен для работы с денежными значениями.
Итоги
Вы научились форматировать значения с учётом локали с помощью FormatStyle:
formatted()выдаёт корректные для локали значения по умолчанию; передайте формат, чтобы настроить результат..number,.currency(code:),.percent,.dateTime,.relative,.measurementи.listпокрывают большинство потребностей.- Добавляйте
.locale(_:), чтобы переопределить регион; форматы также могут выполнять обратный разбор текста. - Никогда не создавайте вручную разделители, символы валюты или порядок компонентов даты.
Часто задаваемые вопросы
Урок «Форматирование с учётом локали» бесплатный?
Да — полный текст урока «Форматирование с учётом локали» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Форматирование с учётом локали»?
Форматируйте числа, даты и валюты с учётом локали. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Форматирование с учётом локали»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Каталоги строк и локализованные строки
- Множественное число и Stringsdict
- Форматирование с учётом локали
- Справа налево и направление компоновки