2009-03-20 13 views
8

Sto provando a convertire una stringa di numeri, inseriti dall'utente, in una stringa sexy come Phone.app sull'iPhone. Ecco il codice che sto usando, che non funziona (non esce un formato speciale) e dopo un certo numero di cifre inizia semplicemente ad aggiungere "0" alla fine della stringa.NSNumberFormatter per formattare i numeri di telefono degli Stati Uniti

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterNoStyle]; 
[formatter setPositiveFormat:@"+# (###) ###-###"]; 
[formatter setLenient:YES]; 
NSString *strDigits = [self stringByReplacingOccurrencesOfRegex:@"[^0-9+]" withString:@""]; 
return [formatter stringFromNumber:[NSNumber numberWithDouble:[strDigits doubleValue]]]; 

risposta

11

Penso che il tuo problema è che NSNumberFormatter non supporta parentesi, spazi o trattini. Ho cercato di implementare lo stesso metodo come te e ha fallito in modo silenzioso e ha appena prodotto un testo non formattato.

Il problema generale qui è che l'SDK iPhone non fornisce un metodo per formattare i numeri di telefono in modo dipendente dalle impostazioni internazionali.

ho sollevato bug con Apple per la seguente (due di questi sono stati duplicati di problemi noti così ho incluso di Apple # bug originale per chi):

#6933244 - Need iPhone SDK interface to format text as locale dependent phone number 
#5847381 - UIControl does not support a setFormatter method 
#6024985 - Overridden UITextField drawTextInRect method is never called 

In un mondo ideale Apple potrebbe fornire un NSPhoneNumberFormatter e chiamereste setFormatter sul vostro UIControl in modo che visualizzasse text in un bel modo carino. Sfortunatamente questo non esiste su iPhone.

2

Beh un numero di telefono dovrebbe essere di 10 caratteri (11 con il principale 1), quindi si dovrebbe iniziare modificando questo:

[formatter setPositiveFormat:@"+# (###) ###-####"]; 

E a proposito dei principali 1, è necessario verificare la presenza di anche quello.

9

UIPhoneFormats.plist contiene formati di telefono predefiniti per ogni locale. Quindi, se siete interessati solo a numeri di telefono degli Stati Uniti, è necessario prendere in considerazione questi formati:

+1 (###) ### - ####
1 (###) ### - ####
011 $
### - ####
(###) ### - ####

che dovevo fare qualcosa di simile , e ho condiviso i risultati che ho ottenuto qui: http://the-lost-beauty.blogspot.com/2010/01/locale-sensitive-phone-number.html

2

Apple afferma che è possibile implementare il formattatore personalizzato se la funzionalità dei formattatori esistenti non è sufficiente:

NSFormatter è destinato alla sottoclasse. Un formattatore personalizzato può limitare l'input e migliorare la visualizzazione dei dati in modi nuovi. Ad esempio, potresti avere un formattatore personalizzato che garantisce che i numeri di serie immessi da un utente siano conformi ai formati predefiniti. Prima di decidere di creare un formattatore personalizzato, assicurarsi di non poter configurare le sottoclassi pubbliche NSDateFormatter e NSNumberFormatter per soddisfare i requisiti.

Per istruzioni su come creare un formattatore personalizzato, vedere Creazione di un formattatore personalizzato.

Vedi the section in Data Formatting Guide

Problemi correlati