Någon som vet om det finns nåt sätt att i kod formatera om ett telefonnummer för presentation från t.ex. 468123456 till 08-123456? Riktnumret kan ju vara olika många tecken, kanske även landskoden? Finns någon standard eller liknande jag ej vet om? Detta går att lösa med regular expressions. Har kollat runt lite, men tycker mig inte hitta nåt som hjälper mig med mitt problem, att validera ett telefonnummer är en sak, men att redan ha ett telefonnummer som t.ex. ser ut så här 0468123456 och sedan formatera om det till 08-123456 för presentation. Hur skulle detta gå till? Ge mig gärna ett exempel någon... Problemet är bara att alla inte bor i ett område med två siffror till riktnummer. Tom 4 siffror i ett riktnummer idag. Du får nog använda en box för riktnummer och en för själva telefonnummret. Ja, jag förstår problemet... :) Fast samtidigt är det väl så att det inte finns två riktnummer AB och ABC? Är väl inne lite på Niklas linje här... Tack, fick det att funka, men kommer dock inte användas ändå, alldeles för tungrott när man ibland har en lista på över 100 nummer som ska presenteras, där varje nummer ska formateras och måste jämföras med riktnummerlistan... ... och därför tipsade jag om smarta sätt att spara det på. Problemet är naturligtvis om du definitivt ska hämta rakt ur en datakälla och inte har någon makt över hur det sparas. Annars går ju detta att göra ganska smärtfritt. Då är svaret till chef, kund, etc. enkelt: Detta kanske fungerar. 8 hittar vi lätt. 2 siffriga (3 siffror med 0) hittar vi med en array. Resten är 3 siffror (4 med nollan). Vet ej om detta är något för dig men kanske löser en del av ditt problem. Snygga till koden överlåter jag till dig. :-)Formatera telefonnummer
Sv: Formatera telefonnummer
Sök runt på forumet hur du använder detta, ett mönster som kanske fungerar är:
<code>
^(([+]\d{2}[ ][1-9]\d{0,2}[ ])|([0]\d{1,3}[-]))((\d{2}([ ]\d{2}){2})|(\d{3}([ ]\d{3})*([ ]\d{2})+))$
</code>Sv:Formatera telefonnummer
Sv: Formatera telefonnummer
Jag använder denna [0][1-9]{1,1}[0-9]{5,}. Då kan användaren bara ange siffror. Ett riktnummer på minst två siffror där start siffran är 0 samt ett telefonnummer som minst består av 5 siffror.Sv:Formatera telefonnummer
Men det är inte jag som styr över hur telefonnumren registreras, däri ligger mitt problem. Jag screenscrapar (jag vet, inget bra sätt, men det som används) ett webbgränssnitt som jag inte har någon kontroll över och vill presentera de telefonnummer som redan finns registrerade i formatet 468123456 i formatet 08-123456...Sv:Formatera telefonnummer
Då skulle man ju, om man får tag i en lista över alla riktnummer, helt enkelt göra en match mot den listan, och på så sätt få fram var numret ska kapas. (Och tänker man riktig lågnivå kan man ju helt enkelt ha dem i ett tvånivå-träd; första noden är riktnumret, andra är resten av numret. Nya nummer kan enbart läggas till under en befintlig nivå.
EDIT: insåg att det kanske lät lite snurrigt.
Jag tänker mig att vi har en lista (med de enda numren jag kan i huvet):
08
031
0303
Den innehåller alla befintliga riktnummer.
När vi sen får ett nummer, gör vi helt enkelt en koll på de n första siffrorna för att se om det finns någon som matchar. Om ingen matchar så är telefonnumret fel, eller så är något ändrat, eller så saknas helt enkelt ett riktnummer. Om någon matchar bryter vi strängen exakt vid den positionen.
t.ex.
030312345
Kommer då matchas mot 0303, vi kapar den biten, och sätter bindestreck där. Sen finns massa smarta sätt att lagra detta på, men det är ju en annan femma.
Detsamma kan naturligtvis även göras på landsnivå, men eftersom nummer presenteras olika i sverige och i utlandet blir problemet betydligt större isf.Sv: Formatera telefonnummer
Ett snabbt exempel på hur du kan göra detta i en metod som returnerar strängen du vill ha ut.
protected void Page_Load(object sender, EventArgs e)
{
lblPhoneNr.Text += FormatPhoneNumber("46800000000") + "<br />";
lblPhoneNr.Text += FormatPhoneNumber("46498123456") + "<br />";
lblPhoneNr.Text += FormatPhoneNumber("46303123456") + "<br />";
lblPhoneNr.Text += FormatPhoneNumber("+46303001002") + "<br />";
lblPhoneNr.Text += FormatPhoneNumber("00468777888") + "<br />";
}
private string FormatPhoneNumber(string strPhone)
{
string strAreaCode = String.Empty;
string strPhoneNumber = String.Empty;
Regex regex = new Regex("(46|0046|\\+46)+(8|31|498|303)(\\d*)",
RegexOptions.IgnoreCase |
RegexOptions.Multiline |
RegexOptions.IgnorePatternWhitespace);
MatchCollection matches = regex.Matches(strPhone);
foreach (Match m in matches)
{
strAreaCode = m.Groups[2].Value;
strPhoneNumber = m.Groups[3].Value;
}
return "0" + strAreaCode + "-" + strPhoneNumber;
}
Sedan får du hämta in de riktnummer du vill från någon extern källa så slipper du skriva världens längsta regex.
Mvh David
Sv:Formatera telefonnummer
Sv: Formatera telefonnummer
Sv: Formatera telefonnummer
"Det finns tre alternativ.
1. Jag får gå in och redigera hur grejerna sparas.
2. Det tar en jävla tid vid varje visning.
3. Vi delar inte upp i riktnummer / telefonnummer"Sv: Formatera telefonnummer
Dim riktnr() As String = {11, 13, 16, 18, 19, 21, 23, 26, 31, 33, 35, 36, 40, 42, 44, 46, 54, 60, 63, 90}
If Microsoft.VisualBasic.Left(TextBox2.Text, 1) = "8" Then
' 8 nuffra som riktnummer
ElseIf Array.Exists(riktnr, AddressOf riktnummer) Then
' Rolig kod som klipper ut dom två första nuffrornas som riktnummer
Else
' Rolig kod som klipper ut dom tre första nuffrorna som riktnummer
End If
Function riktnummer(ByVal s As String) As Boolean
If s.ToString = Microsoft.VisualBasic.Left(TextBox2.Text, 2).ToString Then
Return True
Else
Return False
End If
End Function
/Janne