В одном моем проекте 99% клиентов из России, Казахстана и Украины. И вот взбрело мне в голову сделать авторизацию через смс. Нашёл шлюз, отправил пару тестовых смс, стал двигаться дальше и уперся в проверку номера телефона. Сначала думал делать через MaskEdit, но почитав про него в интернете понял, что это не самый лучший вариант, а какой же лучший? Через простой TEdit, ну в моем случае, через TUniEdit, что почти тоже самое, за исключением того, что программа под WEB. Итак, посмотрим как это легко и быстро сделать в Delphi. Вот что у нас получится.
Вот что будет, если с номером что-то не так…
Итак, я создал отдельный модуль для проверки номера телефона
Вариант 2 (оптимизированный)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
function TPhoneNumberCheck.IsPhoneNumberOK2( PhoneNumberSource: string; Country:Integer; var ResultPhoneNumber:string; var ErrorMessage:string ): Boolean; var i: Integer; begin // Result:=false; case Country of 0: // RUSSIA begin if not IsFirstSymbolsOk('+7',PhoneNumberSource,ErrorMessage) then Exit; Result:=GatherAndCheckPhoneNumber( PhoneNumberSource, ResultPhoneNumber, 11, // 79163080631 << 11 digits ErrorMessage ); end; 1: // UKRAINE begin if not IsFirstSymbolsOk('+38',PhoneNumberSource,ErrorMessage) then Exit; Result:=GatherAndCheckPhoneNumber( PhoneNumberSource, ResultPhoneNumber, 12, // +38(073)7232323 << 12 digits ErrorMessage ); end; 2: // KAZAKHSTAN begin if not IsFirstSymbolsOk('+7',PhoneNumberSource,ErrorMessage) then Exit; Result:=GatherAndCheckPhoneNumber( PhoneNumberSource, ResultPhoneNumber, 11, // +77710009998 << 11 digits ErrorMessage ); end; end; end; function TPhoneNumberCheck.GatherAndCheckPhoneNumber( PhoneNumberSource:string; var ResultPhoneNumber:string; CorrectDigitsNumber:Integer; var ErrorMessage:string ):boolean; var i: Integer; begin // Result:=false; ResultPhoneNumber:=''; for i := 1 to PhoneNumberSource.Length do if IsItDigit(PhoneNumberSource[i]) then ResultPhoneNumber:=ResultPhoneNumber+PhoneNumberSource[i];// // check phone number length if ResultPhoneNumber.Length=CorrectDigitsNumber then Result:=true else begin if ResultPhoneNumber.Length>CorrectDigitsNumber then ErrorMessage:='Введены лишние цифры' else if ResultPhoneNumber.Length<CorrectDigitsNumber then ErrorMessage:='Недостаточно цифр. Введено '+ResultPhoneNumber.Length.ToString+' из ' +CorrectDigitsNumber.ToString+' цифр'; Result:=false; end; end; function TPhoneNumberCheck. IsFirstSymbolsOk(CorrectSymbols,SourceString:string; var ErrorMessage:string ):boolean; begin // // check first symbols: is first symbol +, and second symbol 7, must be +7 if Pos(CorrectSymbols,SourceString)<>1 then begin Result:=false; ErrorMessage:='Номер должен начинаться с '+CorrectSymbols; end else Result:=True; end; |
Пример использования
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
procedure TMainForm.bGetSMSCodeClick(Sender: TObject); var ResultPhoneNumber:string; ErrorMessage:string; begin if FPhoneNumberCheck.IsPhoneNumberOK2( Trim(ePhoneNumber.Text), cbCountry.ItemIndex, ResultPhoneNumber, ErrorMessage ) then begin eCode.Text:='OK '+ResultPhoneNumber; bSendCode.Show; Self.Height:=427; eCode.Show; end else eCode.Text:=' not OK '+ErrorMessage; end; |
Вариант 1 (не оптимизированный)
Сначала проверяю есть ли в начале код страны, например +7 или +38
Далее собираю все цифры из строки – это дает определенную свободу для человека. Набирать +79163080631 или +7 916 308 06 31 или +7-916-308-06-31 или ещё как-то
Ну и на последнем шаге – проверка длины номера. Если что-то не так – сообщение пишется в переменную ErrorMessage
Вот собственно код…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
unit uPhoneNumberCheck; interface uses SysUtils, Classes,Vcl.Dialogs; type TPhoneNumberCheck = class(TDataModule) private { Private declarations } public { Public declarations } function IsPhoneNumberOK(PhoneNumber,Country:string;var ResultPhoneNumber:string; var ErrorMessage:string):Boolean; function IsItDigit(someChar: char): Boolean; end; function PhoneNumberCheck: TPhoneNumberCheck; implementation {$R *.dfm} uses UniGUIVars, uniGUIMainModule, MainModule; function PhoneNumberCheck: TPhoneNumberCheck; begin Result := TPhoneNumberCheck(UniMainModule.GetModuleInstance(TPhoneNumberCheck)); end; { TPhoneNumberCheck } function TPhoneNumberCheck.IsItDigit(someChar:char): Boolean; begin if not (someChar in ['0'..'9']) then Result:=false else Result:=true; end; function TPhoneNumberCheck.IsPhoneNumberOK( PhoneNumber,Country: string; var ResultPhoneNumber:string; var ErrorMessage:string ): Boolean; var MaxNumberOfDigitsInNumber:integer; i: Integer; SomeLength: Integer; begin // if Country=COUNTRY_RUSSIA then begin // check first symbols: is first symbol +, and second symbol 7, must be +7 if Pos('+7',PhoneNumber)<>1 then begin Result:=false; ErrorMessage:='Номер должен начинаться с +7'; Exit; end; //gathering digits from string ResultPhoneNumber:=''; for i := 0 to PhoneNumber.Length do if IsItDigit(PhoneNumber[i]) then ResultPhoneNumber:=ResultPhoneNumber+PhoneNumber[i];//ResultPhoneNumber+'chr'+'('+PhoneNumber[i]+')'; MaxNumberOfDigitsInNumber:=11; // 79163080631 << 11 digits // check phone number length if ResultPhoneNumber.Length=MaxNumberOfDigitsInNumber then Result:=true else begin if ResultPhoneNumber.Length>MaxNumberOfDigitsInNumber then ErrorMessage:='Введены лишние цифры' else if ResultPhoneNumber.Length<MaxNumberOfDigitsInNumber then ErrorMessage:='Недостаточно цифр. Введено '+ResultPhoneNumber.Length.ToString+' из ' +MaxNumberOfDigitsInNumber.ToString+' цифр'; Result:=false; end; end; if Country=COUNTRY_UKRAINE then begin // check first symbols: is first symbol +, and second symbol 7, must be +7 if Pos('+38',PhoneNumber)<>1 then begin Result:=false; ErrorMessage:='Номер должен начинаться с +38'; Exit; end; //gathering digits from string ResultPhoneNumber:=''; for i := 0 to PhoneNumber.Length do if IsItDigit(PhoneNumber[i]) then ResultPhoneNumber:=ResultPhoneNumber+PhoneNumber[i];//ResultPhoneNumber+'chr'+'('+PhoneNumber[i]+')'; MaxNumberOfDigitsInNumber:=12; // +38(073)7232323 << 12 digits // check phone number length if ResultPhoneNumber.Length=MaxNumberOfDigitsInNumber then Result:=true else begin if ResultPhoneNumber.Length>MaxNumberOfDigitsInNumber then ErrorMessage:='Введены лишние цифры' else if ResultPhoneNumber.Length<MaxNumberOfDigitsInNumber then ErrorMessage:='Недостаточно цифр. Введено '+ResultPhoneNumber.Length.ToString+' из ' +MaxNumberOfDigitsInNumber.ToString+' цифр'; Result:=false; end; end; if Country=COUNTRY_KAZAKHSTAN then begin // check first symbols: is first symbol +, and second symbol 7, must be +7 if Pos('+7',PhoneNumber)<>1 then begin Result:=false; ErrorMessage:='Номер должен начинаться с +7'; Exit; end; //gathering digits from string ResultPhoneNumber:=''; for i := 0 to PhoneNumber.Length do if IsItDigit(PhoneNumber[i]) then ResultPhoneNumber:=ResultPhoneNumber+PhoneNumber[i];//ResultPhoneNumber+'chr'+'('+PhoneNumber[i]+')'; MaxNumberOfDigitsInNumber:=11; // +77710009998 << 11 digits // check phone number length if ResultPhoneNumber.Length=MaxNumberOfDigitsInNumber then Result:=true else begin if ResultPhoneNumber.Length>MaxNumberOfDigitsInNumber then ErrorMessage:='Введены лишние цифры' else if ResultPhoneNumber.Length<MaxNumberOfDigitsInNumber then ErrorMessage:='Недостаточно цифр. Введено '+ResultPhoneNumber.Length.ToString+' из ' +MaxNumberOfDigitsInNumber.ToString+' цифр'; Result:=false; end; end; end; initialization RegisterModuleClass(TPhoneNumberCheck); end. |
Пример вызова функции в главном модуле
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
procedure TMainForm.bSendClick(Sender: TObject); var ResultPhoneNumber:string; ErrorMessage:string; begin if FPhoneNumberCheck. IsPhoneNumberOK( Trim(ePhoneNumber.Text), COUNTRY_RUSSIA, ResultPhoneNumber, ErrorMessage ) then eCode.Text:='OK '+ResultPhoneNumber else eCode.Text:=' not OK '+ErrorMessage; eCode.Show; end; |