Sostituisci non numerico con stringa vuota
-
06-07-2019 - |
Domanda
Aggiunta rapida ai requisiti nel nostro progetto. Un campo nel nostro DB per contenere un numero di telefono è impostato per consentire solo 10 caratteri. Quindi, se vengo superato " (913) -444-5555 " o qualsiasi altra cosa, c'è un modo rapido per eseguire una stringa attraverso una sorta di funzione di sostituzione speciale che posso fargli passare un set di caratteri per consentire?
Regex?
Soluzione
Sicuramente regex:
string CleanPhone(string phone)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(phone, "");
}
o all'interno di una classe per evitare di ricreare continuamente la regex:
private static Regex digitsOnly = new Regex(@"[^\d]");
public static string CleanPhone(string phone)
{
return digitsOnly.Replace(phone, "");
}
A seconda degli input del mondo reale, potresti volere qualche logica aggiuntiva lì per fare cose come eliminare 1 in testa (per lunghe distanze) o qualsiasi cosa trascini una x o X (per estensioni).
Altri suggerimenti
Puoi farlo facilmente con regex:
string subject = "(913)-444-5555";
string result = Regex.Replace(subject, "[^0-9]", ""); // result = "9134445555"
Non è necessario utilizzare Regex.
phone = new String(phone.Where(c => char.IsDigit(c)).ToArray())
Ecco il metodo di estensione per farlo.
public static class Extensions
{
public static string ToDigitsOnly(this string input)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(input, "");
}
}
Usando i metodi Regex in .NET dovresti essere in grado di abbinare qualsiasi cifra non numerica usando \ D, in questo modo:
phoneNumber = Regex.Replace(phoneNumber, "\D", "");
Che ne dici di un metodo di estensione che non usa regex.
Se ti attieni a una delle opzioni Regex, usa almeno RegexOptions.Compiled
nella variabile statica.
public static string ToDigitsOnly(this string input)
{
return new String(input.Where(char.IsDigit).ToArray());
}
Questo si basa sulla risposta di Usman Zafar convertita in un gruppo di metodi.
per prestazioni ottimali e minor consumo di memoria, prova questo:
using System;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
public class Program
{
private static Regex digitsOnly = new Regex(@"[^\d]");
public static void Main()
{
Console.WriteLine("Init...");
string phone = "001-12-34-56-78-90";
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
DigitsOnly(phone);
}
sw.Stop();
Console.WriteLine("Time: " + sw.ElapsedMilliseconds);
var sw2 = new Stopwatch();
sw2.Start();
for (int i = 0; i < 1000000; i++)
{
DigitsOnlyRegex(phone);
}
sw2.Stop();
Console.WriteLine("Time: " + sw2.ElapsedMilliseconds);
Console.ReadLine();
}
public static string DigitsOnly(string phone, string replace = null)
{
if (replace == null) replace = "";
if (phone == null) return null;
var result = new StringBuilder(phone.Length);
foreach (char c in phone)
if (c >= '0' && c <= '9')
result.Append(c);
else
{
result.Append(replace);
}
return result.ToString();
}
public static string DigitsOnlyRegex(string phone)
{
return digitsOnly.Replace(phone, "");
}
}
Il risultato nel mio computer è:
Init ...
Tempo: 307
Tempo: 2178
Sono sicuro che esiste un modo più efficiente per farlo, ma probabilmente lo farei:
string getTenDigitNumber(string input)
{
StringBuilder sb = new StringBuilder();
for(int i - 0; i < input.Length; i++)
{
int junk;
if(int.TryParse(input[i], ref junk))
sb.Append(input[i]);
}
return sb.ToString();
}
prova questo
public static string cleanPhone(string inVal)
{
char[] newPhon = new char[inVal.Length];
int i = 0;
foreach (char c in inVal)
if (c.CompareTo('0') > 0 && c.CompareTo('9') < 0)
newPhon[i++] = c;
return newPhon.ToString();
}