
swift-formatstyle
Formats and parses locale-aware numbers, decimals, currencies, percentages, dates, durations, measurements, names, lists, byte counts, and URLs with Foundation FormatStyle and ParseableFormatStyle. Use when replacing legacy Formatter subclasses, designing reusable format APIs, using SwiftUI Text(:format:), correcting availability, or testing user-facing formatted output across locales.
- Installs
- 2.7K
- Last 24h
- +20
- Trending rank
- #5804
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/dpearson2699/swift-ios-skills --skill swift-formatstyle- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads swift-formatstyle automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Swift FormatStyle
Use Foundation's type-safe FormatStyle APIs for user-facing display and ParseableFormatStyle when the same convention must accept input. Route String Catalogs, plurals, localized copy, bundles, and RTL layout to ios-localization; formatting still requires locale review even when no text is translated.
Contents
- Workflow
- Quick Reference
- Selection and Availability
- Parsing
- SwiftUI Integration
- Custom FormatStyle
- Common Mistakes
- Review Checklist
- References
Workflow
- Identify the value's semantic type and whether output is display-only or must round-trip through parsing.
- Select the narrowest built-in style and keep the user's current locale unless a wire format explicitly requires another locale.
- Render the exact UI with representative locales such as
en_US,de_DE,ar_SA, andja_JP. - Check separators, numbering systems, calendars, currency and unit conventions, text direction, and layout.
- If output or parsing fails, fix the style or surrounding copy, restore the input fixture, and rerun the same locale matrix.
Load FormatStyle Recipes when implementation needs concrete modifiers, date intervals, relative dates, duration patterns, measurements, names, lists, byte counts, or URL component controls.
Quick Reference
| Value | Default style | Important constraint |
|---|---|---|
Int, Double | .number | Configure precision, rounding, grouping, notation, or sign only as required. |
Decimal | .number, .percent, .currency(code:) | Prefer for exact decimal display and parsing. |
| Currency | .currency(code:) | Pass an ISO 4217 code; never hardcode a symbol. |
| Percent | .percent | Confirm whether the input is a fraction (0.85) or whole percent (85). |
Date | .dateTime, .relative, .interval | Relative output should usually stand alone, not be embedded in a sentence. |
Duration | .time(pattern:), .units(allowed:width:) | Requires iOS 16+; choose compact clock output versus labeled units. |
Measurement | .measurement(width:usage:) | usage: controls locale-aware conversion policy. |
PersonNameComponents | .name(style:) | Do not manually concatenate name parts. |
| Collections | .list(type:width:) | Let locale rules choose separators and conjunctions. |
| Byte count | .byteCount(style:) | Choose file, memory, decimal, or binary semantics deliberately. |
URL | .url | Requires iOS 16+; query, port, and fragment are opt-in display components. |
Selection and Availability
- Prefer
FormatStyleover legacyNumberFormatter,DateFormatter,DateComponentsFormatter, and manual interpolation for new iOS 15+ code. Durationformat styles andURL.FormatStylerequire iOS 16+.Date.AnchoredRelativeFormatStylerequires iOS 18+ and formats relative to a fixed anchor rather than the current moment.- Omit
.locale(...)for normal UI so the style inherits the user's locale. Use a fixed locale only for an explicit protocol or test fixture. - Treat relative date output as standalone text unless the entire sentence is localized around it.
Docs: FormatStyle
Parsing
Use the matching parseable style when users edit or import formatted values:
let style = Decimal.FormatStyle.Currency(code: "USD")
.locale(Locale(identifier: "en_US"))
let value = try Decimal("$3,500.63", format: style)
let display = value.formatted(style)
The fixed locale above is appropriate only because the input contract is explicitly en_US. For normal UI input, use the user's locale and test round trips with representative decimal separators, currency placement, calendars, and numbering systems.
SwiftUI Integration
Prefer Text(_:format:) so SwiftUI owns the formatted value:
Text(price, format: .currency(code: currencyCode))
Text(date, format: .dateTime.month().day().year())
Text(duration, format: .units(allowed: [.minutes, .seconds]))
For every user-facing formatted Text, preview or test the exact screen across the locale matrix. Use Text(.now, style: .timer), Text(.now, style: .relative), or Text(timerInterval:) for live-updating time displays rather than manually scheduling string refreshes.
Custom FormatStyle
Create a custom style only when built-in composition cannot express the domain convention. FormatStyle refines Codable and Hashable; keep styles as reusable values and add ParseableFormatStyle only when input must round-trip.
struct AbbreviatedCountStyle: FormatStyle {
func format(_ value: Int) -> String {
switch value {
case ..<1_000: "\(value)"
case 1_000..<1_000_000: String(format: "%.1fK", Double(value) / 1_000)
default: String(format: "%.1fM", Double(value) / 1_000_000)
}
}
}
extension FormatStyle where Self == AbbreviatedCountStyle {
static var abbreviatedCount: Self { .init() }
}
Custom styles still need locale and accessibility review; a compact English suffix may not be suitable for every locale.
Common Mistakes
| Mistake | Fix |
|---|---|
| Manual formatting or legacy formatter allocation in view code | Use the matching FormatStyle and Text(_:format:). |
| Hardcoded currency symbol or locale | Pass an ISO currency code and inherit the user locale unless the contract says otherwise. |
| Binary floating-point for exact decimal input | Use Decimal.FormatStyle and its matching parse strategy. |
Assuming URL.formatted() preserves every component | Opt in to .port(.always), .query(.always), or .fragment(.always) only when those components should display. |
| Relative date output embedded in a larger sentence | Keep it standalone or localize the complete sentence. |
| Clock-style duration used for prose | Use .units(allowed:width:) for labeled output. |
| Measurement conversion left implicit | Select a usage: appropriate to the UI. |
| One-locale spot check | Run the same exact-screen fixture across representative locales and fix/rerun failures. |
Review Checklist
- Semantic value type and display-versus-parse requirement identified
- Built-in
FormatStyleused where it can express the convention - Availability gated beside iOS 16+ and iOS 18+ APIs
- Currency uses an ISO 4217 code; exact decimal values use
Decimal - User locale inherited unless a protocol explicitly fixes it
- Relative date text stands alone or the full sentence is localized
- URL components and measurement
usage:are deliberate - SwiftUI uses
Text(_:format:)for formatted values - Exact rendered UI and parse round trips pass the representative-locale matrix
References
- Detailed recipes and modifiers: references/formatstyle-recipes.md
- Apple docs: FormatStyle · ParseableFormatStyle · Date.FormatStyle · Duration.TimeFormatStyle · URL.FormatStyle
FAQ
What does the swift-formatstyle skill do?
Formats and parses locale-aware numbers, decimals, currencies, percentages, dates, durations, measurements, names, lists, byte counts, and URLs with Foundation FormatStyle and ParseableFormatStyle. Use when replacing legacy Formatter subclasses, designing reusable format APIs, using SwiftUI Text(:format:), correcting availability, or testing user-facing formatted output across locales.
How do I install swift-formatstyle?
Run npx skills add https://github.com/dpearson2699/swift-ios-skills --skill swift-formatstyle in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/swift-formatstyle/ (personal) or .claude/skills/swift-formatstyle/ (project).
Which AI agents can use swift-formatstyle?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is swift-formatstyle safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains swift-formatstyle?
It is published by dpearson2699 in dpearson2699/swift-ios-skills. It has 2,700 recorded installs.
More from dpearson2699/swift-ios-skills
swiftui-animation
dpearson2699/swift-ios-skills
Implement, diagnose, or review SwiftUI motion using explicit and scoped implicit animations, springs, transitions, PhaseAnimator, KeyframeAnimator, matched geometry or navigation zoom, SF Symbol effects, and custom Animation types. Use when views should animate on state changes, insertion, removal, navigation, or multi-step choreography, or when motion must respect Reduce Motion and Swift concurrency.
ios-accessibility
dpearson2699/swift-ios-skills
Build and audit SwiftUI, UIKit, and AppKit accessibility for VoiceOver, Voice Control, Switch Control, Full Keyboard Access, Dynamic Type, focus restoration, labels/traits/actions, traversal, custom rotors, NSAccessibility, XCTest checks, adaptive system preferences, and App Store accessibility declarations. Use when implementing accessible UI, fixing an accessibility audit, testing assistive-technology behavior, or substantiating App Store Accessibility Nutrition Labels.
swiftui-performance
dpearson2699/swift-ios-skills
Profile, diagnose, and remediate SwiftUI runtime performance using code review, Instruments, and repeatable measurements. Use when a SwiftUI screen renders slowly, scrolling or animations hitch, view bodies update excessively, list identity churns, layout work spikes, or broad Observation dependencies raise CPU cost. Covers evidence-based triage, SwiftUI Instruments lanes, lazy-container guardrails, state lifetime, and before/after verification.
swiftui-patterns
dpearson2699/swift-ios-skills
Builds and reviews SwiftUI views with modern MV architecture, state, composition, isolated previews, and migration guidance. Covers @Observable ownership, @State/@Bindable/@Environment wiring, view decomposition, ViewModifiers, environment values, .task loading, iOS 26+ handoffs, Writing Tools, clipboard availability, and performance. Use when structuring SwiftUI state, managing @Observable, composing views, previewing meaningful UI states, or correcting SwiftUI patterns.
app-store-review
dpearson2699/swift-ios-skills
Audits App Store submission readiness and rejection risk across current review guidelines, PrivacyInfo.xcprivacy and required-reason APIs, privacy labels, ATT, StoreKit payments, metadata, entitlements, widgets, and Live Activities. Use when preparing a submission, responding to rejection, reconciling privacy evidence, or separating upload blockers from cleanup.
ios-networking
dpearson2699/swift-ios-skills
Build, review, or improve networking code in iOS/macOS apps using URLSession with async/await, structured concurrency, and modern Swift patterns. Use when working with REST APIs, downloading files, uploading data, WebSocket connections, pagination, retry logic, request middleware, caching, background transfers, or network reachability monitoring. Also use when handling HTTP requests, API clients, network error handling, or data fetching in Swift apps.
Popular mobile skills
design-mobile-apps
designed-by-ai/skills
Design mobile app screens with Sleek, edit Sleek projects, and implement their designs in React Native or HTML.
ios-design
uizze.sh
Design and review iOS UI/UX for iPhone apps in SwiftUI, UIKit, or React Native. Use for mobile app design, screen redesigns, navigation flows, typography, forms, keyboard and safe-area layout, and accessibility checks. Apply Apple Human Interface Guidelines and consult real product references through the optional Uizze connection.
vercel-react-native-skills
vercel-labs/agent-skills
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
animate-expo
emilkowalski/skills
Build animations in React Native and Expo, making the decisions in the order that determines whether they feel right — should it animate, which thread it runs on, which properties, spring or timing, how the gesture hands off, how it degrades. Writes the implementation with Reanimated, Gesture Handler, Expo Router and expo-haptics. Use when animating anything in an Expo app, adding gestures, sheets, screen transitions, press feedback or haptics, or fixing motion that stutters on device. For web animation use animate.
xcode-project-setup
firebase/agent-skills
Safely modifies Xcode projects (.pbxproj) to add Swift Packages and link files. Use this skill whenever an iOS project needs dependencies installed (e.g. Firebase, Alamofire).
firebase-remote-config-basics
firebase/agent-skills
Manages Firebase Remote Config templates, feature flags, loading strategies, and SDKs (Android, iOS). Use when downloading/deploying remoteconfig JSON templates, managing version history/feature flags, setting in-app defaults, fetchAndActivate(), real-time listeners, or SDK setup. Don't use for Firebase Hosting, Auth, Firestore, Data Connect, Crashlytics, or App Hosting.