LocaleFormatter
The locale-sensitive half of the basic catalog, kept as a contract rather than an implementation.
formatNumber, formatCurrency, formatDate and pluralize are specified in terms of "the platform's native locale formatting" — Intl.NumberFormat on the web, NumberFormatter on Apple platforms, android.icu on Android. commonMain has none of those and Kotlin's standard library carries no locale data at all, so no implementation of this can live in commonMain alone.
The evaluator therefore depends on this interface and never on a platform. Two implementations ship: FallbackLocaleFormatter, which is locale-independent and is what a renderer gets until it asks for otherwise, and SymbolLocaleFormatter, which reads the platform's own symbols through LocaleData. A host reaches the second through localeFormatter or systemLocaleFormatter.
This is deliberately an interface rather than an expect declaration, and it stayed one after the platform implementations landed: an expect would make every target's formatter the only formatter, and the injection point is what lets a host substitute its own — an app that already carries ICU, or a test that wants an instant to render the same in every environment.
Inheritors
Functions
value as an amount in currency, an ISO 4217 code. Arguments otherwise as formatNumber.
The instant epochMillis rendered with the Unicode TR35 pattern pattern.
Which CLDR plural category value falls into for this formatter's locale.