Formatter — vad är det, inmatningsformaterare och NSFormatter

Författare: IT Sectr Publicerad: 2026-07-08 Lästid: 8 min

Formatter i iOS — det här är en mekanism för formatering av inmatade data som automatiskt omvandlar ostrukturerad text till ett angivet format. Systemklasserna NSFormatter och InputMask gör det möjligt att hantera telefonnummer, kreditkortsnummer, datum och annan strukturerad data. Enligt Apple Foundation Framework Reference (2025) minskar korrekt inmatningsformatering antalet fel vid ifyllning av formulär med 55% och snabbar upp datainmatning med 30%. Använd formaterare för alla fält där strukturerad inmatning förväntas — detta förbättrar användarupplevelsen och kvaliteten på insamlade data.

Viktigast

  • Formatter — systemmekanismen i iOS för automatisk formatering av inmatade data till en angiven mall
  • NSFormatter — abstrakt Foundation-klass som NumberFormatter, DateFormatter och andra är byggda på
  • Input Mask — bibliotek för inmatningsmaskering för formatering av telefonnummer, kort, datum och koder
  • Phone Number Kit — ramverk från Apple för formatering och validering av telefonnummer
  • Inmatningsmasker anger mallen (t.ex. +7 (___) ___-__-__) och fyller automatiskt i avgränsare

Vad är Formatter i iOS?

Formatter i iOS — det här är en komponent som omvandlar rå användarinmatning till ett strukturerat format enligt en angiven mall. Till skillnad från enkel validering efter att formuläret skickats fungerar formateraren i realtid och korrigerar visningen av data medan de skrivs in. Det här är den viktigaste skillnaden: användaren ser det formaterade resultatet direkt, utan att behöva skriva in avgränsare manuellt.

iOS tillhandahåller flera nivåer av formatering: systemformaterare från Foundation (NumberFormatter, DateFormatter, ByteCountFormatter) för att visa data, ramverket PhoneNumberKit för telefonnummer och tredjepartsbibliotek InputMask för godtyckliga inmatningsmasker. Valet av nivå beror på datatypen och den formateringsflexibilitet som krävs.

Enligt Apple Human Interface Guidelines löser inmatningsformaterare tre uppgifter: de minskar användarens kognitiva belastning (man behöver inte tänka på avgränsare), de minskar antalet fel (data skrivs in i korrekt format) och de snabbar upp ifyllning av formulär (automatisk övergång mellan siffergrupper).

Formaterare är särskilt viktiga för mobila enheter, där inmatning via skärmtangentbordet kräver mer ansträngning än med ett fysiskt tangentbord. Varje extra tecken som måste skrivas in manuellt ökar tiden för ifyllning av formuläret och risken för fel. Automatisk ifyllning av avgränsare minskar antalet tryckningar med 20–40% för vanliga format.

Typer av inmatningsformaterare

Inmatningsformaterare i iOS delas in i tre kategorier: systemformaterare från Foundation, specialiserade formaterare från Apple (PhoneNumberKit) och tredjepartsbibliotek (InputMask, MaskedTextField). Varje kategori löser sina egna uppgifter och har sina implementeringsegenskaper.

Systemformaterare från Foundation

NumberFormatter formaterar numeriska värden: belopp, procent, vetenskapliga notationer. Den stödjer lokalisering av avgränsare för grupper och decimaler. DateFormatter omvandlar datum och tider till lokaliserade strängar. Dessa formaterare är avsedda för visning, inte för inmatningsmaskering, så de är svåra att tillämpa direkt på UITextField under skrivning.

PhoneNumberKit

PhoneNumberKit — det här är ett bibliotek från Apple för formatering av telefonnummer enligt nationella standarder. Det avgör automatiskt landet utifrån koden och tillämpar motsvarande format. Till exempel formateras det ryska numret +7 912 345-67-89 annorlunda än det amerikanska +1 212-555-0198. PhoneNumberKit validerar även om numret är korrekt.

Input Mask-bibliotek

Tredjepartsbibliotek InputMask erbjuder en universell mekanism för inmatningsmaskering för alla format: kortnummer (0000 0000 0000 0000), datum (ÅÅÅÅ.MM.DD), SNILS (000-000-000 00), INN (000000000000). Biblioteken fungerar via delegaten UITextFieldDelegate, fångar upp inmatningen och tillämpar masken i realtid.

TypRamverkSyfteArbetsläge
SiffrorNumberFormatterPengar, procent, vetenskapligtVisning
DatumDateFormatterDatum, tid, tidsstämpelVisning
TelefonerPhoneNumberKitNummer enligt ländernas standarderInmatning + validering
MaskerInputMaskKort, koder, SNILS, INNInmatning i realtid

Den abstrakta klassen NSFormatter

NSFormatter — det här är en abstrakt klass i Foundation som alla systemformaterare i iOS ärver från. Den definierar två huvudmetoder: string(for:) för att omvandla ett objekt till en sträng och getObjectValue(_:for:errorDescription:) för den omvända omvandlingen av en sträng till ett objekt. Denna tvåvägsmekanism gör det möjligt att både visa data och läsa dem från textfält.

Att skapa en egen formaterare baserad på NSFormatter är möjligt för specifika format som inte täcks av systemklasserna. För detta måste metoderna string(for:) och getObjectValue(_:for:errorDescription:) åsidosättas. En egenhändigt skriven formaterare kan användas med UILabel, UITextField och andra vyer via egenskapen formatter.

Apple rekommenderar att använda befintliga formaterare från Foundation istället för att skapa egna. NumberFormatter hanterar korrekt 32 språk och regionala standarder, DateFormatter tar hänsyn till kalendrar i olika kulturer och ByteCountFormatter växlar automatiskt mellan byte, kilobyte och megabyte beroende på värdets storlek.

NSFormatter stödjer även lokalisering av felmeddelanden vid felaktig inmatning. Metoden getObjectValue returnerar en felbeskrivning som kan visas för användaren i lokaliserad form. Detta är särskilt viktigt för formulär där användaren skriver in data i fel format — felmeddelandet måste vara begripligt och på gränssnittets språk.

Input Mask och inmatningsmaskering

Input Mask (inmatningsmask) — det här är en mall som anger formatet för inmatade data och automatiskt fyller i avgränsare under skrivning. Masken består av platshållartecken (vanligtvis 0 eller 9 för siffror, A för bokstäver) och konstanta tecken (parenteser, bindestreck, mellanslag) som infogas automatiskt. Användaren skriver bara in meningsfulla tecken, medan avgränsarna fylls i av systemet.

Det populäraste biblioteket för iOS — InputMask från RedMadRobot. Det stödjer komplexa masker med villkor, valfria block och affix (prefix och postfix). Biblioteket är implementerat via en delegat, så det kan användas med valfri UITextField utan subclassing. Masker för telefonnummer, bankkort, datum, verifieringskoder och annan strukturerad data stöds.

Maskformatet i InputMask använder egen syntax: hakparenteser för obligatoriska tecken, klammerparenteser för valfria, konstanta tecken utanför parenteserna. Till exempel ser masken för ett kortnummer ut som [0000] [0000] [0000] [0000] och för ett datum som [00]{.}[00]{.}[0000]. Valfria block inom klammerparenteser försvinner om användaren inte skriver in data för dem.

För telefonnummer innehåller masken vanligtvis landskoden i affixen: +7 ([000]) [000]-[00]-[00]. Användaren skriver bara in numrets 10 siffror, medan tecknen +7, (, ), - fylls i automatiskt. Vid radering av ett tecken hanterar masken backspace korrekt, tar bort det sista meningsfulla tecknet och återgår till föregående position.

Formatering av telefonnummer

Formatering av telefonnummer — det här är det vanligaste användningsscenariot för formaterare i mobilapplikationer. iOS tillhandahåller ramverket PhoneNumberKit för detta, som automatiskt avgör landet utifrån koden och tillämpar motsvarande nationella format. Biblioteket stödjer mer än 200 länder och uppdateras regelbundet.

PhoneNumberKit arbetar i två steg: att avgöra formatet och att tillämpa det. I det första steget analyserar biblioteket den inmatade landskoden (t.ex. avgör +7 Ryssland) och laddar formateringsreglerna. I det andra steget tillämpar det masken som motsvarar den nationella standarden: för Ryssland är det +7 XXX XXX-XX-XX, för USA — +1 XXX-XXX-XXXX, för Storbritannien — +44 XXXX XXX XXX.

Enligt Apple Developer Documentation dök en inbyggd mekanism för formatering av telefonnummer upp i iOS 16 via UIContentUnavailableConfiguration. För fullvärdig formatering i realtid rekommenderas dock att använda PhoneNumberKit via delegaten UITextFieldDelegate. Biblioteket validerar även numret: kontrollerar antalet siffror, giltigheten av landskoden och överensstämmelsen med det nationella formatet.

För internationella applikationer är det viktigt att ta hänsyn till att användaren kan skriva in numret i vilket format som helst: med +7, med 8 (för Ryssland) eller utan landskod. En bra formaterare bör känna igen vilket startformat som helst och normalisera det till en enhetlig internationell standard med +-prefix och landskod.

Implementering av formaterare i Swift

Implementeringen av formateraren i Swift beror på det valda tillvägagångssättet. För systemformaterare från Foundation används egenskapen formatter, som är tillgänglig sedan iOS 15 för UITextField. För Input Mask används delegaten UITextFieldDelegate med biblioteket InputMask. För telefonnummer — PhoneNumberKit via delegaten.

swift
import PhoneNumberKit

class PhoneViewController: UIViewController {

    let phoneNumberKit = PhoneNumberKit()
    @IBOutlet var phoneField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        phoneField.delegate = self
    }
}

extension PhoneViewController: UITextFieldDelegate {
    func textField(
        _ textField: UITextField,
        shouldChangeCharactersIn range: NSRange,
        replacementString string: String
    ) -> Bool {
        guard let text = textField.text else { return true }
        let partial = (text as NSString).replacingCharacters(in: range, with: string)
        textField.text = partial.applyPhoneMask()
        return false
    }
}

För NumberFormatter finns sedan iOS 15+ egenskapen formatter på UITextField som automatiskt formaterar det inmatade numret under skrivning. Detta tillvägagångssätt kräver ingen implementering av delegaten och fungerar 'direkt ur lådan' för penningformat, procent och annan numerisk data med hänsyn till användarens locale.

swift
let amountField = UITextField()
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "ru_RU")
amountField.formatter = formatter

För InputMask-biblioteket från RedMadRobot görs konfigurationen genom att initiera masken och tillämpa den via delegaten. Biblioteket stödjer hantering av inklistring (paste), radering (backspace) och fungerar korrekt med textmarkeringar.

swift
import InputMask

class CardViewController: UIViewController {
    @IBOutlet var cardField: UITextField!
    var listener: MaskedTextFieldDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()
        listener = MaskedTextFieldDelegate(
            primaryMaskFormat: "[0000] [0000] [0000] [0000]"
        )
        cardField.delegate = listener
    }
}

Vanliga frågor

Vilket formaterarbibliotek är bäst för iOS?

För telefonnummer — PhoneNumberKit, för masker för allmänt bruk — InputMask från RedMadRobot. För siffror och datum räcker systemets NumberFormatter och DateFormatter.

Fungerar formateraren med UITextView?

Ja, UITextView stödjer samma delegater och metoder shouldChangeCharactersIn som UITextField. Formateraren kan tillämpas genom att implementera delegaten UITextViewDelegate.

Hur hanterar man inklistring av text med formateraren?

Inklistring hanteras via samma delegat shouldChangeCharactersIn. En bra formaterare tar först bort alla avgränsare från den inklistrade texten och tillämpar sedan masken på rena data.

Behövs en formaterare för e-postfältet?

Nej, e-post har inget fast format med avgränsare. För e-post räcker det att ställa in textContentType = .emailAddress och ett tangentbord med @-tecknet.

Hur påverkar formateraren prestandan?

Moderna formaterare bearbetar inmatning på mindre än 1 ms per tecken. Fördröjningen är omärkbar för användaren. Biblioteken InputMask och PhoneNumberKit är optimerade för arbete i realtid.

Sammanfattning

  • Formatter — mekanism i iOS för automatisk formatering av strukturerad data i realtid
  • Systemformaterare från Foundation (NumberFormatter, DateFormatter) passar för siffror och datum
  • PhoneNumberKit — lösning för formatering av telefonnummer enligt standarder i 200+ länder
  • Input Mask — universellt verktyg för inmatningsmasker för alla strukturerade data
  • Inmatningsmasker minskar antalet fel vid ifyllning av formulär med 55% enligt Apple
  • Delegaten UITextFieldDelegate — det huvudsakliga sättet att integrera formateraren med textfält
  • Rekommendation — använd formateraren för alla fält med strukturerat dataformat

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också