Asterisk IF Statement - Wie vergleichen

voipd

IPPF-Promi
Mitglied seit
5 Mai 2005
Beiträge
3,187
Punkte für Reaktionen
4
Punkte
38
Hallo zusammen,

ich versuche gerade eine Variable zurecht zu schneiden.
Ziel ist es die Rufnummer ins internationale Format zu bringen:
Code:
Aus        030123456 -> 4930123456
und aus 004930123456 -> 4930123456
und aus 003355123456 -> 3355123456
Code:
exten => #,10,Set(NR=030123456) ; oder 004930123456
...
exten => #,20,Set(NR=${IF(${NR} = _0Z.?49${NR:1}:000)})                                           
exten => #,21,Set(NR=${IF(${NR} = _00Z.?${NR:2}:000)})
Wenn die Rufnummer 030123456 benutzt wird, dann kommt nach dem ersten IF NR=4930123456 heraus und das zweite IF macht dann NR=30123456 daraus.

D.h., dass beide IF Statement immer true sind. :gruebel:
Das beide false sind haette ich noch verstanden.

Wenn ich ein exten => #,10,Set(NR=123456) setze werden auch beide Statements als true erkannt, obwohl diese Rufnummer nicht mit einer 0 beginnt und somit bei beiden Statements als false behandelt werden sollte.

Warum? Kann mir jemand das erklaeren, bzw. sagen wie man diesen Vergleich richtig macht. Im Internet habe ich (zu) wenig zu dem Asterisk If Statement und den Vergleichen gefunden. Gibt es da noch eine gute Seite/Quelle?

Danke.

voipd.
 
Versuch's mal etwas einfacher ;)

Code:
exten => #,10,Set(NR=030123456) ; oder 004930123456
...
exten => #,21,Set(NR=${IF(${NR:0:2} = "00"?49${NR:2}:$NR)})                                           
exten => #,22,Set(NR=${IF(${NR:0:1} = "0"?49${NR:1}:$NR)})

Erläuterung:
21 prüft, ob die ersten beiden Stellen von $NR Nullen sind, ist dies der Fall, werden sie durch 49 ersetzt, sonst passiert nichts
22 prüft, ob die erste Stelle von $NR 0 ist, ist dies der Fall (nationales Format mit NDC) wird sie durch 49 ersetzt, sonst passiert nichts.

Um jetzt noch Rufnummern ohne vorangestellten NDC zu handeln (lokale Rufnummern, kann man folgendes machen:

Code:
exten => #,10,Set(NR=030123456) ; oder 004930123456
...
exten => #,21,Set(NR=${IF(${NR:0:2} = "00"?+49${NR:2}:$NR)})                                           
exten => #,22,Set(NR=${IF(${NR:0:1} = "0"?+49${NR:1}:$NR)}) 
exten => #,23,Set(NR=${IF(${NR:0:1} = "+"?49${NR:1}:49$NDC$NR)})

Es wird statt 49 +49 ersetzt.
In Zeile 23 wird geprüft, ob das erste Zeichen ein + ist, respektive Zeile 21 oder 22 die $NR verändert haben. Ist dies der Fall, wird das + wieder entfernt, sonst wird $NR 49$NDC vorangestellt. $NDC muss dabei die relevante Vorwahl (ohne 0) des entsprechenden Ortsnetzes sein.
 
Hallo abw1oim,

da muss noch ein Fehler sein, aber ich sehe ihn nicht.
exten => #,21,Set(NR=${IF(${NR:0:2} = "00"?+49${NR:2}:$NR)})
21 prüft, ob die ersten beiden Stellen von $NR Nullen sind, ist dies der Fall, werden sie durch 49 ersetzt
Das funktioniert anscheinend nicht! Wenn die NR=069123456 ist, sollte die Rufnummer nicht manipuliert werden. Wird aber trotzdem und es kommt +499123456 raus.
Warum ist diese Bedingung true? :gruebel:
Wird "00" als "0" gewertet? Ist "=" ueberhaupt ein Stringvergleich?

von der Logik her sieht deine Loesung perfekt aus, wobei Zeile 21 leicht geaendert werden muesste, was aber nichts an dem Problem aendert, dass der Vergleich nicht auf false geht.
Code:
exten => #,21,Set(NR=${IF(${NR:0:2} = "00"?+${NR:2}:$NR)})

EDIT: Einen Fehler habe ich noch gefunden. In allen "False" Verzweigungen wurden die geschweiften Klammern ${...} vergessen.

voipd.
 
Zuletzt bearbeitet:
Klassischer Fall von zu schnell getippt:

Code:
exten => #,1,Set(NDC=30)
exten => #,n,Set(NR=030123456) ; oder 004930123456
exten => #,n,NoOp(${NR:0:2})
exten => #,n,Set(NR=${IF($["${NR:0:2}"="00"]?+${NR:2}:${NR})})
exten => #,n,NoOp(${NR:0:1})
exten => #,n,Set(NR=${IF($["${NR:0:1}"="0"]?+49${NR:1}:${NR})})
exten => #,n,NoOp(${NR:0:1})
exten => #,n,Set(NR=${IF($["${NR:0:1}"="+"]?${NR:1}:49${NDC}${NR})})
exten => #,n,NoOp(${NR});
exten => #,n, Hangup();

Erklärung: Der Vergleich muss ja True oder False liefern. Das tut er aber nur, wenn er selbst wieder geklammert ist:

Code:
$["${NR:0:2}"="00"]

Außerdem: Wenn die Nummer bereits international ist, gehört natürlich der CountryCode nicht nochmal hin, Schande auf mein Haupt ;)
Desweiteren: $NR ist natürlich Quatsch, das liefert den Text $NR, es muss natürlich ${NR} heißen, dann klappt's auch.

Nochmal: Asche auf mein Haupt, jetzt funktionierts aber (ist jedesmal eben doch ein Abenteuer, meine AEL-Lösungen auf non-AEL abzubilden :p )
 
Entschuldigung aber ich habe es auch hingefuckelt. :-)

Code:
exten => #,2,Set(NDC=30)
exten => #,3,Set(NR=${IF($["${NR:0:2}" = "00"]?+${NR:2}:${NR})})
exten => #,4,Set(NR=${IF($["${NR:0:1}" = "0"]?+49${NR:1}:${NR})})
exten => #,5,Set(NR=${IF($["${NR:0:1}" = "+"]?${NR:1}:49${NDC}${NR})})

Egal ob:
030123456
004930123456
123456

Es kommt immer 4930123456 heraus.

Vielen Dank abw1oim! Bitte nicht sauer sein, dass ich nochmals nachgefragt habe und in der Zwischenzeit es selbst herausprobiert habe. Ich wollte dich nicht scheuchen. :)

Edit: Das mit dem Klammern des Vergleiches ist schon eine Sache fuer sich. Danke nochmals.

voipd.

voipd.
 
kein Problem ;)
 
Kostenlos!

Statistik des Forums

Themen
248,331
Beiträge
2,288,424
Mitglieder
377,626
Neuestes Mitglied
Erz-Oldi