{*******************************************************} { } { Methods of Sting } { } { 版权所有 (C) 2020 KngStr } { } {*******************************************************} unit ksString; interface /// /// 创建空白文件 /// function CreateBlankFile(S: string): Boolean; /// /// 自动为已存在文件名加数字 /// function AutoChangeFileName(AFile: string): string; /// /// 自动替换文件名中的非法字符为 /// procedure ChangeInvalidFileNameChars(var FileName: string; AChar: Char = '_'); /// /// 格式化秒为时间,冒号分割 /// function FormatSeconds(const AValue: Int64): string; overload; /// /// 格式化秒为时间,冒号分割 /// function FormatSeconds(const AValue: Integer): string; overload; /// /// 格式化秒为时间,冒号分割 /// function FormatSeconds(const AValue: Double): string; overload; /// /// 是否中国手机号 /// 13900000000 /// +8613900000000 /// +86 139 0000 0000 /// +86-139-0000-0000 /// /// 仅允许数字和开头的+ function IsChineseMobileNumber(S: string; AOnlyNum: Boolean = False): Boolean; implementation uses Classes, SysUtils, IOUtils; function CreateBlankFile(S: string): Boolean; var FStrm: TFileStream; begin Result := False; try FStrm := TFileStream.Create(S, fmCreate); if FStrm = nil then Exit; Result := True; FreeAndNil(FStrm); except FStrm := nil; end; end; function AutoChangeFileName(AFile: string): string; var I: Integer; sPath, sExt: string; begin Result := AFile; I := 0; sPath := ChangeFileExt(Result, ''); sExt := ExtractFileExt(Result); while FileExists(Result) do begin Inc(I); Result := Format('%s(%d)%s', [sPath, I, sExt]); end; end; procedure ChangeInvalidFileNameChars(var FileName: string; AChar: Char); var PFileName: PChar; FileNameLen: Integer; Ch: Char; I: Integer; begin I := 0; PFileName := PChar(FileName); FileNameLen := Length(FileName); while I < FileNameLen do begin Ch := PFileName[I]; if not TPath.IsValidFileNameChar(Ch) then PFileName[I] := AChar else Inc(I); end; end; function FormatSeconds(const AValue: Double): string; overload; var h, m, s, ms: Integer; begin ms := Trunc(Frac(AValue) * 1000); s := Trunc(AValue); m := s div 60; h := m div 60; if h > 0 then Result := Format('%.2d:%.2d:%.2d.%.3d', [h, m mod 60, s mod 60, ms]) else Result := Format('%.2d:%.2d.%.3d', [m, s mod 60, ms]); end; function FormatSeconds(const AValue: Int64): string; var h, m, s: Integer; begin s := AValue; m := s div 60; h := m div 60; if h > 0 then Result := Format('%.2d:%.2d:%.2d', [h, m mod 60, s mod 60]) else Result := Format('%.2d:%.2d', [m, s mod 60]); end; function FormatSeconds(const AValue: Integer): string; overload; begin FormatSeconds(Int64(AValue)); end; function IsChineseMobileNumber(S: string; AOnlyNum: Boolean): boolean; var p: PChar; i: Integer; begin Result := False; // 最短肯定是11位 if (Length(S) < 11) then Exit; i := 0; p := PChar(S); while p^ <> #0 do begin if p^ = '+' then begin if i > 0 then // +号必须在第一位 Exit; if (p[1] = '8') and (p[2] = '6') then // +86,而且是连续的 Inc(p, 3) else Exit; end else if ((p^ >= '0') and (p^ <= '9')) then begin if (i = 0) and (p^ <> '1') then // 中国手机号都是1开头 Exit; Inc(p); Inc(i); end else if (not AOnlyNum) and ((p^ = '-') or (p^ = ' ')) then Inc(p) else Exit; end; Result := i = 11; //中国手机号 11位 end; end.