Domanda

Nella mia applicazione C #, utilizzo un'espressione regolare per convalidare il formato di base di un numero di telefono statunitense per assicurarmi che l'utente non stia semplicemente inserendo dati fasulli. Quindi, rimuovo tutto tranne i numeri, quindi questo:

  

(123) 456-7890 x1234

diventa

  

12345678901234

nel database. In varie parti della mia domanda, tuttavia, vorrei riconvertire questo numero di telefono normalizzato in

  

(123) 456-7890 x1234

Qual è il modo migliore per fare una cosa del genere? (A proposito, non preoccuparti della contabilità dei formati di numeri di telefono internazionali.)

È stato utile?

Soluzione

String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))

Si tradurrà in (123) 456-7890 x 123

Altri suggerimenti

Usando un regex puoi sostituire:

(\d{3})(\d{3})(\d{4})(\d{4})

con:

(\1) \2-\3 x\4

(Anche se non ho familiarità con i numeri di telefono statunitensi, quindi forse c'è dell'altro.)

Userei solo una stringa di formato personalizzata per trasformare il numero nuovamente nella stringa:

class Program
{
    static void Main(string[] args)
    {
        long phoneNumber = 12345678901234;
        string phoneNumberString = String.Format("{0:(000) 000-0000 x0000}", phoneNumber);
        Console.WriteLine(phoneNumberString);
    }
}

Ovviamente, lo trasformeresti in una funzione che richiederebbe il numero di telefono come lungo e quindi restituire la stringa (con il formato caricato o memorizzato come costante nel metodo o qualcosa di appropriato per la tua situazione).

Oh, e se lo hai in una stringa e non in un lungo, puoi facilmente convertire la stringa in un lungo, quindi passarla alla funzione di formattazione. Naturalmente, ci sono considerazioni sulle prestazioni qui se lo stai facendo ripetutamente (dal momento che stai iterando la stringa per creare il long e poi riconvertendola in una stringa, quando puoi semplicemente usare la sottostringa).

Se supporti solo numeri statunitensi, puoi semplicemente formattare le cifre per mostrare parentesi e x dove vuoi.

Preferirei memorizzare l'intera stringa, analizzarla usando una regex per convalidarla, quindi memorizzarla in una stringa normalizzata.

Per far sì che accetti qualsiasi Paese, lo farei:

Vorrei aggiungere il codice IDD a tutti i numeri di telefono, quindi nasconderlo agli utenti di quel paese.

quindi: (123) 456-7890 x1234 verrebbe memorizzato come +1 (123) 456-7890 x1234

Il regex (compatibile con perl) sarebbe qualcosa di simile (completamente non testato e non funzionerebbe):

??

(+ \ d +) \ s + (((\ d {, 3})) (\ s + ([- 0-9.] {6,}) \ s + ((x | ext \ w *) \ d {,} 4)

  • Questo è un numero opzionale di cifre preceduto da +
  • Seguito da uno o più spazi
  • Quindi un gruppo opzionale di massimo 3 cifre tra parentesi
  • Quindi uno o più spazi
  • Quindi un gruppo di 6 o più cifre, trattini o punti
  • Quindi uno o più spazi
  • Quindi una x o una parola facoltativa che inizia con ext (ext, extension ...) e un gruppo di massimo 4 cifre

Avrei un database di utenti che includa prefisso internazionale e prefisso, quindi inserirli automaticamente nel caso in cui fossero mancanti, il paese avrebbe la sua convenzione di raggruppamento delle cifre predefinita per i numeri di telefono (3,4 per noi).

  • Quindi, se ti trovi nell'area 123 negli Stati Uniti e inserisci 456.7890, verrebbe analizzato come +1 (123) 4567890 e lo vedresti solo come 456-7890
  • se sei in Qatar e inserisci il numero 4444555 extenshn 33, è memorizzato come +974 4444555 x33, lo vedresti come 4444555 x33

Il codice internazionale non verrà visualizzato per gli utenti nello stesso paese e il prefisso non verrà visualizzato per gli utenti nello stesso paese e prefisso. Il numero completo verrà visualizzato sumouseover (etichetta HTML?)

DEVI scomporlo per il DB? Altrimenti no. Se DEVI, puoi archiviare le diverse parti in diversi campi, (prefisso, prefisso, numero abbonato, estensione).

Oppure, estrarre il numero e iniziare l'analisi. Se sono solo 10 cifre, allora sai che non c'è estensione. Tutte le cifre oltre le 10, inseriscile nella stringa dopo una "x" o qualcosa del genere.

Ho fatto qualcosa di simile a questo in un'app C ++ Ho scritto i diversi meccanismi di contatto memorizzati come una singola stringa, ma invece ho fatto il contrario di quello che stai facendo. Ho rimosso i campi da una finestra di dialogo e ho creato il numero formattato per memorizzarlo come stringa.

Ecco un metodo di estensione che potrebbe aiutare:

public static string InsertStringAtPositions(this string str, string insertStr, IEnumerable<int> positions)
{
    if (str != null && insertStr != null && positions != null)
    {
        string newString = string.Empty;
        int previousPos = 0;
        foreach (var pos in positions)
        {
            if (pos < str.Length)
            {
                newString += str.Substring(previousPos, pos - previousPos) + insertStr;
                previousPos = pos;
            }
        }
        if (positions.Last() < str.Length)
        {
            return newString + str.Substring(positions.Last(), str.Length - positions.Last());
        }
        return newString;
    }
    return str;
}

Utilizzo:

// Will convert "0399998888" to "03 9999 8888"
number.InsertStringAtPositions(" ", new[] {2, 6});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top