{*******************************************************}
{ }
{ 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.