Frage

In meiner C # -Anwendung, verwende ich einen regulären Ausdruck das Grundformat einer US-Telefonnummer zu überprüfen, um sicherzustellen, dass der Benutzer nicht nur falsche Daten eingeben. Dann habe ich alles außer Zahlen Streifen aus, so folgt aus:

  

(123) 456-7890 x1234

wird

  

12345678901234

in der Datenbank. In verschiedenen Teilen meiner Anwendung, jedoch würde Ich mag diese normalisierte Telefonnummer konvertieren zurück zu

  

(123) 456-7890 x1234

Was ist der beste Weg, um so etwas zu tun? (Keine Sorge für die internationale Telefonnummer Formate über Buchhaltung, übrigens.)

War es hilfreich?

Lösung

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

Wird in Folge (123) 456-7890 x 123

Andere Tipps

einen regulären Ausdruck verwenden können Sie ersetzen:

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

mit:

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

(Obwohl ich mit US-Telefonnummern nicht vertraut bin so vielleicht gibt es mehr zu ihm.)

Ich würde nur einen benutzerdefinierte Format-String verwenden, um die Nummer zurück in die Zeichenfolge zu verwandeln:

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

Natürlich würden Sie es ausklammern in eine Funktion, die die Telefonnummer als lange dauern würde und dann wieder die Zeichenfolge (mit dem Format geladen oder als Konstante in der Methode gespeichert, oder etwas für Ihre Situation geeignet).

Oh, und wenn Sie es in einem String und keine lange haben, können Sie einfach den String in eine lange konvertieren, und es dann in der Format-Funktion übergeben. Natürlich gibt es Überlegungen zur Leistung hier, wenn Sie es immer wieder tun (da Sie die Zeichenfolge iterieren die lange zu schaffen, und dann zurück in einen String konvertieren, wenn Sie nur Teilkette verwenden könnten).

Wenn Sie nur US-Nummern unterstützen, können Sie einfach die Ziffern formatieren Klammer und x zu zeigen, wo immer Sie wollen.

Ich würde es vorziehen, die gesamte Zeichenfolge zu speichern, ich habe es mit einem Regex analysieren würde es zu bestätigen, dann speichern Sie es in einer normalisierten String.

Um es jedes Land machen zu akzeptieren, würde ich dies tun:

würde ich den IDD-Code zu allen Telefonnummern hinzuzufügen, und dann verstecken sie von den Benutzern aus diesem Land.

so: (123) 456-7890 x1234 würde als +1 (123) 456-7890 x1234 gespeichert werden

Die (Perl-kompatibel) regex so etwas wie wäre (völlig ungetestet und würde nicht funktionieren):

?

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

  • Dies ist eine optionale Anzahl von Ziffern von + voran
  • Gefolgt von einem oder mehreren Leerzeichen
  • Dann eine optionale Gruppe von bis zu 3 Ziffern in Klammern
  • Dann ein oder mehr Leerzeichen
  • Dann eine Gruppe von 6 oder mehr Ziffern, Bindestriche oder Punkte
  • Dann ein oder mehr Leerzeichen
  • Dann ein optional x oder ein Wort, das mit ext (ext, Erweiterung ...) und eine Gruppe von bis zu 4 Ziffern
  • beginnt

Ich habe eine Datenbank von Benutzern einschließlich Landes- und Ortsvorwahl haben würde, dann die automatisch im Falle füllen sie fehlen, würde das Land es Standardzifferngruppierung Konvention für Telefonnummern (3,4 für die us) ist.

  • Wenn Sie also in dem Bereich 123 in der wir sind, und geben Sie 456,7890, würde es als +1 (123) 4567890 analysiert werden, und Sie würden es als 456-7890 nur sehen
  • , wenn Sie in Katar sind und geben Sie die Nummer 4444555 extenshn 33, als +974 4444555 x33 gespeichert wird, würden Sie es als 4.444.555 x33 sehen

Die internationale Vorwahl wird nicht für Benutzer im gleichen Land angezeigt werden, und die Ortsvorwahl wird nicht für Benutzer im gleichen Land und Vorwahl angezeigt. Die volle Zahl Onmouseover angezeigt würde (HTML-Label?)

Haben Sie es brechen für die DB? Wenn nicht, nicht. Wenn Sie müssen, dann können Sie entweder speichern die verschiedenen Teile in verschiedenen Bereichen, (Areacode, Präfix, SubscriberNum, Extenion).

Oder extrahieren Sie die Anzahl und das Parsen beginnen. Wenn es nur 10 Ziffern ist, dann wissen Sie, es keine Erweiterung. Alle Ziffern letzte 10, kleben sie in der Zeichenfolge nach einem ‚x‘ oder so etwas.

habe ich etwas Ähnliches wie dies in einer C ++ app ich schrieb die gespeicherten unterschiedlichen Kontaktmechanismen als einzelne Zeichenfolge, aber stattdessen habe ich das Gegenteil von dem, was Sie tun. Ich nahm die Felder aus Dialog und gebaut, um die formatierte Zahl als String zu speichern.

Hier ist eine Erweiterung Methode, die helfen könnten:

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;
}

Verbrauch:

// Will convert "0399998888" to "03 9999 8888"
number.InsertStringAtPositions(" ", new[] {2, 6});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top