2010-08-20 7 views
30

Ich habe eine Zeichenfolge, wenn eine Telefonnummer eingegeben wird - es gibt eine Maske, so dass es immer aussieht wie "(123) 456-7890" - Ich möchte die Formatierung vor dem Speichern in der DB nehmen.Formatierung aus einer Zeichenfolge entfernen: "(123) 456-7890" => "1234567890"?

Wie kann ich das tun?

+0

BTW, int.Parse ist nicht Teil von C# –

+0

Err, warum ist es dann dokumentiert? http://msdn.microsoft.com/en-us/library/system.int32.parse.aspx –

+4

John Saunders ist einfach falsch. – Timwi

Antwort

71

Eine Möglichkeit mit Linq ist:

string justDigits = new string(s.Where(c => char.IsDigit(c)).ToArray()); 

den Reiniger/kürzere Version dank

string justDigits = new string(s.Where(char.IsDigit).ToArray()) 
+0

+1 schön, du warst ein wenig schneller beim Draw. –

+0

Außer wenn ich es tatsächlich ausführe, funktioniert es nicht. Nur eine Sekunde ... –

+0

'SkipWhile' wird dafür nicht funktionieren. – LukeH

1

craigmoliver Hinzufügen könnten Sie einen regulären Ausdruck verwenden, oder könnten Sie Schleife über jedes Zeichen und verwenden char.IsNumber Funktion .

4

Sie können es mit einem einfachen Regex-Ersatz für diese Nummer arbeiten, aber ich würde nach höheren Anfangsziffern Ausschau halten. Zum Beispiel wird (876) 543-2019 eine Integer-Variable überlaufen.

+0

+1 Guter Punkt. Daran habe ich nicht gedacht. –

+1

Hmm ... ein Teil von mir möchte wirklich diese Nummer wählen und sehen, ob sie echt ist. Ich weiß einfach nicht, was ich sagen würde, wenn jemand antworten würde. –

+0

Es ist noch schlimmer mit Zahlen beginnend mit '+' oder '00' ... – viraptor

1

Sie wären besser dran mit regular expressions. Ein int per Definition ist nur eine Zahl, aber Sie möchten die Formatierungszeichen, um es zu einer Telefonnummer, die eine Zeichenfolge ist.

Es gibt zahlreiche Beiträge zur Telefonnummer Validierung, siehe A comprehensive regex for phone number validation für Vorspeisen.

+0

Ich habe die Frage falsch gelesen, aber die gleichen Informationen gelten. Wenn Sie die zusätzlichen Zeichen * erhalten, können Sie sie mit regulären Ausdrücken entfernen. Ich würde immer noch die Telefonnummer als eine Zeichenfolge speichern, da führende Nullen, die ein gültiger Teil einer Telefonnummer sein könnten, andernfalls als ein int entfernt würden. – JYelton

34

Sie können einen regulären Ausdruck verwenden, um alle nicht-nummerische Zeichen zu entfernen:

string phoneNumber = "(123) 456-7890"; 
phoneNumber = Regex.Replace(phoneNumber, @"[^\d]", ""); 

Dann weiter auf - je nach Bedarf - entweder man speichern kann die Nummer als String oder als Integer. Um die Zahl in eine ganze Zahl zu konvertieren geben Sie folgende Möglichkeiten haben:

// throws if phoneNumber is null or cannot be parsed 
long number = Int64.Parse(phoneNumber, NumberStyles.Integer, CultureInfo.InvariantCulture); 

// same as Int64.Parse, but returns 0 if phoneNumber is null 
number = Convert.ToInt64(phoneNumber); 

// does not throw, but returns true on success 
if (Int64.TryParse(phoneNumber, NumberStyles.Integer, 
     CultureInfo.InvariantCulture, out number)) 
{ 
    // parse was successful 
} 
+8

'[^ \ d]' sollte dasselbe wie nur '\ D' sein? –

+2

Ja, es ist das gleiche. Es macht keinen Unterschied, außer dass '[^ \ d]' expliziter ist und weniger Lernaufwand erfordert. – Timwi

+4

Sie müssen etwas über '[^]' lernen. Ich würde argumentieren, '\ D' erfordert weniger lernen. – recursive

2

Try this:

string s = "(123) 456-7890"; 
UInt64 i = UInt64.Parse(
    s.Replace("(","") 
    .Replace(")","") 
    .Replace(" ","") 
    .Replace("-","")); 

Sie sollten mit diesem sicher sein, da der Eingang maskiert ist.

+0

Wenn die Nummer ist "" (543) 231-2322 "' würden Sie "Int32" überlaufen. –

+0

Guter Punkt. Ersetzt int mit UInt64 –

+0

Sie erkennen, dass er eigentlich keine Zahl will, oder? Der "int.TryParse" war nur seine erste Vermutung - es ist ein Ablenkungsmanöver. – Gabe

4
string digits = Regex.Replace(formatted, @"\D", String.Empty, RegexOptions.Compiled); 
1

Wie viele Antworten bereits erwähnen, müssen Sie zuerst die nicht-stelligen Zeichen entfernen, bevor Sie versuchen, die Zahl zu analysieren. Sie können dies mit einem regulären Ausdruck tun.

Regex.Replace("(123) 456-7890", @"\D", String.Empty) // "1234567890" 

weist jedoch darauf hin, dass der größte positive Wert int halten kann, ist 2,147,483,647 so dass jede Nummer mit einer Ortskennzahl von mehr als 214 würde einen Überlauf verursachen. In dieser Situation ist es besser, lange zu benutzen.

Führende Nullen sind für nordamerikanische Nummern kein Problem, da die Vorwahlnummern nicht mit einer Null oder Eins beginnen können.

1

Alternative mit Linq:

string phoneNumber = "(403) 259-7898"; 
var phoneStr = new string(phoneNumber.Where(i=> i >= 48 && i <= 57).ToArray()); 
+3

der "magische zahlen" teil dieser lösung sollte alle verscheuchen. –

11

Da niemand eine for-Schleife hat.

long phoneNumber = GetPhoneNumber("(123) 456-7890"); 


aktualisieren
Wie pr viele Länder kommentiert tun haben Nullen in dem Anfang der Zahl, wenn man das, dann haben unterstützen müssen Sie:

long GetPhoneNumber(string PhoneNumberText) 
{ 
    // Returns 0 on error 

    StringBuilder TempPhoneNumber = new StringBuilder(PhoneNumberText.Length); 
    for (int i=0;i<PhoneNumberText.Length;i++) 
    { 
     if (!char.IsDigit(PhoneNumberText[i])) 
      continue; 

     TempPhoneNumber.Append(PhoneNumberText[i]); 
    } 

    PhoneNumberText = TempPhoneNumber.ToString(); 
    if (PhoneNumberText.Length == 0) 
     return 0;// No point trying to parse nothing 

    long PhoneNumber = 0; 
    if(!long.TryParse(PhoneNumberText,out PhoneNumber)) 
     return 0; // Failed to parse string 

    return PhoneNumber; 
} 

wie folgt verwendet um eine nicht lange Zeichenfolge zurückzugeben. Gehen Sie folgendermaßen vor, um meinen Code zu ändern:

1) Ändern Sie den Funktionsrückgabetyp von long in string.
2) Stellen Sie die Funktion return null anstelle von 0 auf Fehler
3) Am erfolgreich analysiert es PhoneNumberText macht Rückkehr

+0

Danke behoben. Und ja, das sollte gut vorformulieren, und sollte robust sein, wenn Ihre Benutzereingabe analysiert. – EKS

+1

Er speichert eine Telefonnummer. Warum möchten Sie jemals eine Telefonnummer als Ganzzahl speichern? – Gabe

+1

Ich denke irgendwie gegenüber .. Warum sollte er es nicht speichern als eine Nummer – EKS

3

Abgesehen von allen anderen richtigen Antworten, Telefonnummern als ganze Zahlen zu speichern oder auf andere Weise Strippen Formatierung könnte eine schlechte Idee sein.

Hier sind ein paar Überlegungen:

  • Benutzer internationale Telefonnummern zur Verfügung stellen können, die Ihre Erwartungen nicht passen. See these examples So würden die üblichen Gruppierungen für Standard-US-Nummern nicht passen.
  • Benutzer müssen möglicherweise eine Erweiterung bereitstellen, z. B. (555) 555-5555 ext#343 Der Schlüssel # ist tatsächlich auf dem Dialer/Telefon, kann aber nicht in einer Ganzzahl codiert werden. Benutzer müssen möglicherweise auch den Schlüssel * angeben.
  • Bei einigen Geräten können Sie Pausen einfügen (normalerweise mit dem Zeichen P), die für Nebenstellen oder Menüsysteme oder für die Einwahl in bestimmte Telefonsysteme (z. B. im Ausland) erforderlich sein können. Diese können auch nicht als Ganzzahlen codiert werden.

[EDIT]

Es könnte eine gute Idee sein, sowohl eine ganze Version zu speichern und eine String-Version in der Datenbank. Wenn Sie Zeichenketten speichern, können Sie auch alle Interpunktionen mit einer der oben genannten Methoden auf Leerzeichen reduzieren. Ein regulärer Ausdruck dafür könnte sein:

// (222) 222-2222 ext# 333 -> 222 222 2222 # 333 
phoneString = Regex.Replace(phoneString, @"[^\d#*P]", " "); 

// (222) 222-2222 ext# 333 -> 2222222222333 (information lost) 
phoneNumber = Regex.Replace(phoneString, @"[^\d]", ""); 

// you could try to avoid losing "ext" strings as in (222) 222-2222 ext.333 thus: 
phoneString = Regex.Replace(phoneString, @"ex\w+", "#"); 
phoneString = Regex.Replace(phoneString, @"[^\d#*P]", " "); 
0
public static string DigitsOnly(this string phoneNumber) 
{ 
    return new string(
     new[] 
      { 
      // phoneNumber[0],  (
       phoneNumber[1], // 6 
       phoneNumber[2], // 1 
       phoneNumber[3], // 7 
      // phoneNumber[4], ) 
      // phoneNumber[5], 
       phoneNumber[6], // 8 
       phoneNumber[7], // 6 
       phoneNumber[8], // 7 
      // phoneNumber[9],  - 
       phoneNumber[10], // 5 
       phoneNumber[11], // 3 
       phoneNumber[12], // 0 
       phoneNumber[13] // 9 
      }); 
} 
Verwandte Themen