Bläddra i källkod

add funtions of file size

KngStr 3 år sedan
förälder
incheckning
e25edcc990
1 ändrade filer med 139 tillägg och 0 borttagningar
  1. 139 0
      Source/ksString.pas

+ 139 - 0
Source/ksString.pas

@@ -4,6 +4,10 @@
 {                                                       }
 {       CopyRight (C) 2018-2020 KngStr                  }
 {                                                       }
+{   Some Code from                                      }
+{     QDAC of swish                                     }
+{   Thanks                                              }
+{                                                       }
 {*******************************************************}
 
 unit ksString;
@@ -37,6 +41,26 @@ function FormatSeconds(const AValue: Integer): string; overload;
 function FormatSeconds(const AValue: Double): string; overload;
 
 /// <summary>
+/// 格式化文件大小,拷贝自qdac,增加更多单位
+/// </summary>
+function FormatSize(ASize: Int64): string;
+
+/// <summary>
+/// 文件大小字符串转数字
+/// 1[b] "1 k[b]" " 1 m[b] " 1g[b] 1t[b]
+/// </summary>
+function SizeStrToInt(ASize: string; ADefault: Int64 = 0): Int64;
+
+/// <summary>
+/// 文件大小单位转数字
+/// </summary>
+function SizeUnitToInt(AUnit: string): Int64; overload;
+/// <summary>
+/// 文件大小单位转数字
+/// </summary>
+function SizeUnitToInt(AUnit: Char): Int64; overload;
+
+/// <summary>
 /// 是否中国手机号
 ///  13900000000
 ///  +8613900000000
@@ -134,6 +158,44 @@ begin
   FormatSeconds(Int64(AValue));
 end;
 
+function FormatSize(ASize: Int64): string;
+var
+  AIdx, R1, s1: Int64;
+  AIsNeg: Boolean;
+const
+  Units: array [0 .. 6] of string = ('EB', 'PB', 'TB', 'GB', 'MB', 'KB', 'B');
+begin
+  AIsNeg := (ASize < 0);
+  AIdx := 6;
+  R1 := 0;
+  if AIsNeg then
+    ASize := -ASize;
+  Result := '';
+  while (AIdx >= 0) do
+  begin
+    s1 := ASize mod 1024;
+    ASize := ASize shr 10;
+    if (ASize = 0) or (AIdx = 0) then
+    begin
+      R1 := R1 * 100 div 1024;
+      if R1 > 0 then
+      begin
+        if R1 >= 10 then
+          Result := IntToStr(s1) + '.' + IntToStr(R1) + Units[AIdx]
+        else
+          Result := IntToStr(s1) + '.' + '0' + IntToStr(R1) + Units[AIdx];
+      end
+      else
+        Result := IntToStr(s1) + Units[AIdx];
+      Break;
+    end;
+    R1 := s1;
+    Dec(AIdx);
+  end;
+  if AIsNeg then
+    Result := '-' + Result;
+end;
+
 function IsChineseMobileNumber(S: string; AOnlyNum: Boolean): boolean;
 var
   p: PChar;
@@ -170,4 +232,81 @@ begin
   Result := i = 11; //中国手机号 11位
 end;
 
+function SizeUnitToInt(AUnit: Char): Int64;
+const
+  Units: array [0 .. 6] of Char = ('b', 'k', 'm', 'g', 't', 'p', 'e');
+var
+  I: Integer;
+begin
+  Result := 1;
+
+  for I := Low(Units) to High(Units) do begin
+    if (I > 0) then
+      Result := Result * 1024;
+    if AUnit = Units[I] then
+      Exit;
+  end;
+
+  Result := 1;
+end;
+
+function SizeUnitToInt(AUnit: string): Int64;
+var
+  LSize: string;
+begin
+  Result := 1;
+
+  LSize := Trim(AUnit);
+  case Length(LSize) of
+    1,2: Result := SizeUnitToInt(LSize[Low(LSize)]);
+  end;
+end;
+
+function SizeStrToInt(ASize: string; ADefault: Int64): Int64;
+var
+  p: PChar;
+  c: Char;
+  s: string;
+begin
+  Result := ADefault;
+
+  if Length(ASize) = 0 then
+    Exit;
+
+  s := '';
+  c := #0;
+  p := PChar(ASize);
+  while p^ <> #0 do
+    case p^ of
+      'b', 'k', 'm', 'g', 't', 'p', 'e':
+        begin
+          if c <> #0 then
+            Exit;
+          c := p^;
+          Inc(p);
+          if p^ = 'b' then
+            Inc(p);
+        end;
+      '0' .. '9':
+        begin
+          if c <> #0 then
+            Exit;
+          s := s + p^;
+          Inc(p);
+        end;
+      ',':
+        begin
+          if c <> #0 then
+            Exit;
+          Inc(p);
+        end;
+      ' ':
+        Inc(p);
+    else
+      Exit;
+    end;
+
+  Result := StrToUInt64Def(s, Result) * SizeUnitToInt(c);
+end;
+
 end.