Telefonnummern in kanonisches Format überführen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

Telefonnummern in kanonisches Format überführen

16 Jan 2019, 03:30

Hallo zusammen,

ich möchte bei mir per Tastenkürzel deutsche Telefonnummern in das "Kanonische Format" konvertieren.
Alle mir vorliegenden Telefonnummern haben derzeit das Format "Vorwahl-Anschluss(-Durchwahl)", also z.B. "01234-567890-345".
Folgende Bedingungen sollen dabei berücksichtigt werden:

01234-567890 => +49 (1234) 56 78 90 ' gerade Anzahl von Ziffern beim Anschluss
01234-5667890 => +49 (1234) 566 78 90 ' ungerade Anzahl von Ziffern beim Anschluss
01234-567890-345 => +49 (1234) 56 78 90 - 345 ' gerade Anzahl von Ziffern beim Anschluss mit Durchwahl
01234-5667890-345 => +49 (1234) 566 78 90 - 345 ' ungerade Anzahl von Ziffern beim Anschluss mit Durchwahl

Mein Script sieht derzeit so aus (und funktioniert):

Code: Select all

#NoEnv
#SingleInstance force
SetBatchLines -1
SetControlDelay, -1
SetWinDelay, -1
SetKeyDelay, 0
SetTitleMatchMode, 2
SetTitleMatchMode, Fast
DetectHiddenWindows, On
#Include %A_ScriptDir%
SetWorkingDir %A_ScriptDir%

^!t::														; Strg-Alt-t
	; Telefonnummern für Outlook international formatieren
	; 01234-567890		=> +49 (1234) 56 78 90
	; 01234-5667890		=> +49 (1234) 566 78 90
	; 01234-567890-345	=> +49 (1234) 56 78 90 - 345
	; 01234-5667890-345	=> +49 (1234) 566 78 90 - 345

	TestTel = 01234-567890-123
	aTel := StrSplit(TestTel, "-")							; Telefonnummer bei "-" splitten
	Vorwahl := SubStr(aTel[1], 2)							; Teil vor erstem "-"
	L := % StrLen(aTel[2])									; Länge des Anschlusses nach dem ersten "-"
	Anschluss :=											; Anschluss "leeren"

	If !(L & 1)												; wenn Anzahl Ziffern des Anschlusses gerade (!)
	{
		Loop, % L											; Schleife: Anzahl Ziffern
		{
			If (A_Index & 1)								; wenn Index ungerade (!)
				Anschluss .= A_Space						; dann zusätzliches Leerzeichen
			Anschluss .= SubStr(aTel[2], A_Index, 1)		; nächste Ziffer
		}
	}
	Else
	{
		Loop, % L											; Schleife: Anzahl Ziffern
		{
			If A_Index < 4									; Schleifenzähler < 4
				Anschluss .= SubStr(aTel[2], A_Index, 1)	; einfach nächste Ziffer vom Anschluss übernehmen
			Else											; ab 4. Ziffer
			{
				If !(A_Index & 1)							; wenn Index gerade (!)
					Anschluss .= A_Space					; dann zusätzliches Leerzeichen
				Anschluss .= SubStr(aTel[2], A_Index, 1)	; nächste Ziffer
			}
		}
	}

	If aTel[3] <> ""										; wenn noch Ziffern hinter zweiten "-"
		Anschluss .= " - " . aTel[3]						; mit " - xxx..." definieren

	OLNumber := % "+49 (" . Vorwahl . ") " . Anschluss		; vollständige Telefonnummer
	MsgBox, % OLNumber

Return
Meine Frage: Gibt es nicht eine kürzere bzw. elegantere Möglichkeit der Konvertierung? Ich habe mir den Formatbefehl, auch mit der Möglichkeit des "Auffüllens" angesehen, aber sehe darin keine Hilfe.
Danke schon mal im Voraus.

HG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
swagfag
Posts: 6222
Joined: 11 Jan 2017, 17:59

Re: Telefonnummern in kanonisches Format überführen

16 Jan 2019, 04:13

Code: Select all

phones = 
(C
01234-567890 ; => +49 (1234) 56 78 90 ' gerade Anzahl von Ziffern beim Anschluss	
01234-5667890 ; => +49 (1234) 566 78 90 ' ungerade Anzahl von Ziffern beim Anschluss
01234-567890-345 ;	=> +49 (1234) 56 78 90 - 345	' gerade Anzahl von Ziffern beim Anschluss mit Durchwahl
01234-5667890-345 ;	=> +49 (1234) 566 78 90 - 345	' ungerade Anzahl von Ziffern beim Anschluss mit Durchwahl
)

for each, line in StrSplit(phones, "`n", "`r")
{
	line := RegExReplace(line, "^\d(\d{4})-(\d{2,3})(\d{2})(\d{2})$", "+49 ($1) $2 $3 $4")
	line := RegExReplace(line, "^\d(\d{4})-(\d{2,3})(\d{2})(\d{2})-(\d{3})$", "+49 ($1) $2 $3 $4 - $5")

	res .= line "`n"
}

MsgBox % phones "`n`n" res
User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

Re: Telefonnummern in kanonisches Format überführen

16 Jan 2019, 04:41

wow - sehr schön! - Danke swagfag!
(Ich muss mich irgendwann mal intensiver mit RegEx beschäftigen) ;-)
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

Re: Telefonnummern in kanonisches Format überführen

16 Jan 2019, 05:57

... aahhhrrrrrggg - doch noch kleine Fehler gefunden: die Routine funktioniert nur

- bei Vorwahlen, die genau 5 Stellen haben
- bei Telefonnummern, die 6 oder 7 Stellen haben.

Was müsste man ändern, damit auch kürzere (z.B.: Berlin 030 oder Handys 0170 usw.) oder längere (z.B. Altwigshagen 039777) Vorwahlen berücksichtigt werden?
Was müsste man ändern, damit auch kürzere oder längere Anschluss-Nummern (neue Handy-Nummern haben 7 oder 8 Ziffern) berücksichtigt werden?

HG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
swagfag
Posts: 6222
Joined: 11 Jan 2017, 17:59

Re: Telefonnummern in kanonisches Format überführen

16 Jan 2019, 06:05

Code: Select all

line := RegExReplace(line, "^\d(\d{2,4})-(\d{2,3})(\d{2})(\d{2})(\d{2})?$", "+49 ($1) $2 $3 $4 $5")
line := RegExReplace(line, "^\d(\d{2,4})-(\d{2,3})(\d{2})(\d{2})-(\d{3})$", "+49 ($1) $2 $3 $4 - $5")
User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

Re: Telefonnummern in kanonisches Format überführen  Topic is solved

16 Jan 2019, 08:21

... fast, aber mit einer kleinen Anpassung kann ich leben:

Code: Select all

line := RegExReplace(line, "^\d(\d{2,5})-(\d{2,3})(\d{2})(\d{2})(\d{2})?$", "+49 ($1) $2 $3 $4 $5")
line := RegExReplace(line, "^\d(\d{2,5})-(\d{2,3})(\d{2})(\d{2})-(\d{1,5})$", "+49 ($1) $2 $3 $4 - $5")
Damit werden auch Vorwahlnummern bis 6 Stellen richtig konvertiert (längere gibt es m.M. nach in D nicht).
Es funktionieren Anschluss-Nummern bis zu 9 Stellen ohne Durchwahl-Nummer bzw. 7 Stellen mit Durchwahl-Nummern (sollte auch reichen).
Die Durchwahl-Nummern können 1 bis 5 Stellen betragen (sollte auch reichen) .

Danke nochmals!

HG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Telefonnummern in kanonisches Format überführen

17 Jan 2019, 10:32

Moin,

nur ein Hinweis:
RegExReplace(line, "^\d(\d{2,5})...
Ich nehme an, dass das erste \d in diesem Fall immer eine 0 sein muss.
User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

Re: Telefonnummern in kanonisches Format überführen

17 Jan 2019, 10:47

... jo - danke für den Tipp. Wieder 4 Zeichen gespart! ;)
Herzliche Grüße aus dem Rheinland
Lucky Joe

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 19 guests