我對DELPHI寫的幾個基類型 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
http://dev.csdn.net/article/58/58387.shtm 我對DELPHI寫的幾個基類型 //用慣JAVA或C#的人可能對DELPHI非常生氣,連基本的類型都沒有,我平時工作中,經常會曾試著把一些函數集合在一起,也經常做一些屬於自己的基礎類型的函數,此處把它們弄出來,有不當之處,請大家點評. unit BaseClass; interface uses SysUtils, Classes, StrUtils, IdGlobal, Math; type TCharSet = set of char; var TNormalCharSet: TCharSet = [#13, #10, #32, '.', ',', ';']; type TString = class private FText: string; public function CharAt(APosition: Integer): Char; //指定位置的字母 function toLowerCase: string; overload; class function toLowerCase(AString: string): string; overload; //小寫 function toUpperCase: string; overload; class function toUpperCase(AString: string): string; overload; //大寫 class function ValueOf(AValue: string): Boolean; overload; class function ValueOf(AValue: Boolean): string; overload; class function StringIn(AValue: string; AValues: array of string): Boolean; class function Left(AValue: string; ALength: Integer): string; class function Right(AValue: string; ALength: Integer): string; class function DeletePrefix(AValue: string; FixedString: TCharSet = [#32]): string; //刪除首碼 class function DeleteSuffix(AValue: string; FixedString: TCharSet = [#32]): string; //刪除尾碼 // class function CompareString(AValue1: string; AValue2: string): Boolean; class function HashCode(AValue: string): Integer; class function LastChar(AValue: string): Char; class function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string; class function StringOfChar(Ch: Char; Count: Integer): string; class function SetString(var s: string; buffer: PChar; len: Integer): string; class function GetPy(AStr: string): string; //得到對應的拼音. class function IsAllChinese(AStr: string): Boolean; class function IsAllEnglish(AStr: string): Boolean; class function GetFirstWord(AValue: string; var AWord: string; ASeparator: TCharSet): Integer; overload; class function GetFirstWord(AValue: string; var AWord: string; ASeparator: string): Integer; overload; //返回值為從開始到該單據的長度。 class function GetAllWord(AValue: string; ASeparator: string): TStringList; overload; //返回所有的關鍵字。使用完後,請將結果集Free; //注:在以後的使用中,請不要使用該函數。請使用它的重載版 //GetAllWord(AValue: string; ASeparator: string; AStringList: TStringList); class procedure GetAllWord(AValue: string; ASeparator: string; AStringList: TStrings); overload; //把所有的結果集裝入AStringList; class procedure GetAllWordWithAll(AValue: string; ASeparator: string; AStringList: TStrings); class function StringToCharSet(AValue: string): TCharSet; class function CharSetToString(AValue: TCharSet): string; class function UpdateSentence(AOldString: string; //被操作字串 AUpdateSource: string; //查找的單詞。 AUpdateString: string; //替換的單據。 ASentenceSeparator: string; //句子分隔符號。 AWordSeparator: string //單據分隔符號; ): string; //返回結果。 //如 ' dbarcode ASC, dname DESC', 'dbarcode', '', ',', ' '的返回值為 //' dname DESC'; class function DeleteRepeat(AOldString: string; //要處理字元 ADeleteString: Char; //要刪除的字元 ARepeat: Char): string; //重複字元 class function IfThen(AExpression: Boolean; ATrue: string; AFalse: string): string; //根據運算式的值,返回相應的字串。 class function AbsoluteToRelate(AAbsolute: string; ACurrent: string): string; //給定兩個檔,將絕對路徑轉換成相對路徑。 class function RelateToAbsolute(ARelate: string; ACurrent: string): string; class function SimilarPosition(AOne, ATwo: string): Integer; class function GetCharNum(AString: string; AChar: Char): Integer; class function IndexOf(AString, ASubString: string): Integer; class function ZeroToInt(AString: string): Integer; class function ZeroToFloat(AString: string): Double; class function ZeroToStr(AString: string): string; class function SameText(AString, AString1: string): Boolean; class function Reverse(AString: string): string; class function IsValidIP(const S: String): Boolean; class function FillString(AChar: Char; ALength: Integer): string; class function StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText: string): string; class function GetNextString(var SourceString: string; ASplitChar: string): string; end; //整型類。 TInteger = class class function IntToStr(AInteger: Integer): string; overload; class function IntToStr(AInteger: Int64): string; overload; class function IsValidInt(AString: string): Boolean; class function IsValidInt64(AString: string): Boolean; class function MaxInt: Integer; class function MaxLongInt: Integer; class function HashCode(AInteger: Integer): Integer; class function IntToBin(AInteger: Cardinal): string; class function IntToHex(AInteger: Integer): string; class function HexToInt(AString: string): Integer; class function MakeSerialNo(AInteger: Integer; ADigit: Integer): string; end; TFloat = class class function IsValidFloat(AString: string): Boolean; class function MaxDouble: Double; class function MinDouble: Double; class function MaxExtended: Extended; class function MinExtended: Extended; class function SameValue(const A, B: Single; Epsilon: Single = 0): Boolean; overload; class function SameValue(const A, B: Double; Epsilon: Double = 0): Boolean; overload; class function SameValue(const A, B: Extended; Epsilon: Extended = 0): Boolean; overload; class function FloatToMoney(const Value: Double; Round: Boolean = True): string; end; TBoolean = class class function BoolToStr(ABoolean: Boolean): string; class function StrToBool(AString: string): Boolean; //如果不為'true'則為false; end; implementation { TString } function GetPYIndexChar(AChar: string): Char; begin case WORD(AChar[1]) shl 8 WORD(AChar[2]) of $B0A1..$B0C4: Result := 'A'; $B0C5..$B2C0: Result := 'B'; $B2C1..$B4ED: Result := 'C'; $B4EE..$B6E9: Result := 'D'; $B6EA..$B7A1: Result := 'E'; $B7A2..$B8C0: Result := 'F'; $B8C1..$B9FD: Result := 'G'; $B9FE..$BBF6: Result := 'H'; $BBF7..$BFA5: Result := 'J'; $BFA6..$C0AB: Result := 'K'; $C0AC..$C2E7: Result := 'L'; $C2E8..$C4C2: Result := 'M'; $C4C3..$C5B5: Result := 'N'; $C5B6..$C5BD: Result := 'O'; $C5BE..$C6D9: Result := 'P'; $C6DA..$C8BA: Result := 'Q'; $C8BB..$C8F5: Result := 'R'; $C8F6..$CBF9: Result := 'S'; $CBFA..$CDD9: Result := 'T'; $CDDA..$CEF3: Result := 'W'; $CEF4..$D188: Result := 'X'; $D1B9..$D4D0: Result := 'Y'; $D4D1..$D7F9: Result := 'Z'; else Result := Char(0); end; end; class function TString.GetPy(AStr: string): string; var I: Integer; begin Result := ''; for I := 1 to Length(AStr) do begin if ByteType(AStr, i) = mbTrailByte then Result := Result GetPYIndexChar(AStr[i - 1] AStr[i]) else if ByteType(AStr, i) = mbSingleByte then Result := Result AStr[i]; end; end; function TString.CharAt(APosition: Integer): Char; begin Result := FText[APosition]; end; class function TString.CharSetToString(AValue: TCharSet): string; begin end; class function TString.CompareString(AValue1, AValue2: string): Boolean; begin Result := UpperCase(AValue1) = UpperCase(AValue2); end; class function TString.DeletePrefix(AValue: string; FixedString: TCharSet): string; begin while System.Length(AValue) > 0 do begin if AValue[1] in FixedString then Delete(AValue, 1, 1) else Break; end; Result := AValue; end; class function TString.GetFirstWord(AValue: string; var AWord: string; ASeparator: TCharSet ): Integer; var tmpStr: string; tmpPos: Integer; begin tmpStr := DeleteSuffix(AValue, ASeparator); tmpStr := DeletePrefix(AValue, ASeparator); Result := Length(AValue) - Length(tmpStr); { if Length(tmpStr) = 0 then Exit; if (tmpStr[1] = '''') and (tmpStr[2] = '''')then begin for tmpPos := 3 to Length(tmpStr) do begin if tmpStr[tmpPos] in [''''] then Break; end; end; if tmpPos > 3 then tmpPos :=tmpPos 2; } for tmpPos := 1 to Length(tmpStr) do begin if tmpStr[tmpPos] in ASeparator then Break; end; tmpPos := tmpPos -1; // {TODO : -oghs 修復最後一個參數解析不正確} if (tmpPos = 0) and (AValue <> '') then tmpPos := Length(AValue); AWord := Copy(AValue, Result 1, tmpPos); Result := Result tmpPos; end; class function TString.HashCode(AValue: string): Integer; var i: Integer; tmpValue: Integer; begin tmpValue := 0; for I := 1 to System.Length(AValue) do begin tmpValue := 3 * tmpValue Ord(AValue[I]); end; Result := tmpValue; end; class function TString.IsAllChinese(AStr: string): Boolean; var I: Integer; begin Result := True; for I := 1 to Length(AStr) do begin if ByteType(AStr, I) = mbSingleByte then begin Result := False; Break; end; end; end; class function TString.IsAllEnglish(AStr: string): Boolean; var I: Integer; begin Result := True; for I := 1 to Length(AStr) do begin if ByteType(AStr, I) <> mbSingleByte then begin Result := False; Break; end; end; end; class function TString.LastChar(AValue: string): Char; begin Result := AValue[System.Length(AValue)]; end; class function TString.Left(AValue: string; ALength: Integer): string; begin Result := Copy(AValue, 1, ALength); end; class function TString.Right(AValue: string; ALength: Integer): string; begin Result := StrUtils.RightStr(AValue, ALength); end; class function TString.SetString(var s: string; buffer: PChar; len: Integer): string; begin System.SetString(s, buffer, len); Result := s; end; class function TString.StringIn(AValue: string; AValues: array of string): Boolean; var I: Integer; begin Result := False; for I := Low(AValues) to High(AValues) do begin if UpperCase(AValue) = UpperCase(AValues[I]) then begin Result := True; Break; end; end; end; class function TString.StringOfChar(Ch: Char; Count: Integer): string; begin Result := System.StringOfChar(Ch, Count); end; class function TString.StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string; begin Result := Sysutils.StringReplace(S, OldPattern, NewPattern, Flags); end; class function TString.StringToCharSet(AValue: string): TCharSet; var I: Integer; begin Result := []; for I := 1 to Length(AValue) do begin Result := Result [AValue[I]]; end; end; function TString.toLowerCase: string; begin Result := LowerCase(FText); end; function TString.toUpperCase: string; begin Result := Uppercase(FText); end; class function TString.ValueOf(AValue: Boolean): string; begin if AValue then Result := '是' else Result := '否'; end; class function TString.ValueOf(AValue: string): Boolean; begin Result := StringIn(AValue, ['是', 'yes', 'ok']); end; class function TString.GetFirstWord(AValue: string; var AWord: string; ASeparator: string): Integer; begin Result := GetFirstWord(AValue, AWord, StringToCharSet(ASeparator)); end; class function TString.GetAllWord(AValue, ASeparator: string): TStringList; var tmpList: TStringList; tmpWord: string; begin tmpList := TStringList.Create; while Length(AValue) > 0 do begin tmpWord := ''; Delete(AValue, 1, GetFirstWord(AValue, tmpWord, ASeparator)); if tmpWord <> '' then tmpList.Add(tmpWord) else Break; end; Result := tmpList; end; class function TString.UpdateSentence(AOldString, AUpdateSource, AUpdateString, ASentenceSeparator, AWordSeparator: string): string; var tmpSentence: string; tmpWord: string; tmpWord1: string; i: Integer; tmpResult: string; begin //得到第一個句子 tmpSentence := AOldString; tmpResult := ''; while Length(tmpSentence) > 0 do begin i := GetFirstWord(tmpSentence, tmpWord, ASentenceSeparator); tmpResult := tmpResult Left(tmpSentence, i - Length(tmpWord)); Delete(tmpSentence, 1, I); if tmpWord <> '' then begin i := GetFirstWord(tmpWord, tmpWord1, AWordSeparator); tmpResult := tmpResult Left(tmpWord, i - Length(tmpWord1)); if CompareString(tmpWord1, AUpdateSource) then begin tmpResult := tmpResult AUpdateString; end else begin tmpResult := tmpResult tmpWord; end; end; end; tmpResult := DeletePrefix(tmpResult, [' ', ',']); tmpResult := DeleteSuffix(tmpResult, [' ', ',']); tmpResult := DeleteRepeat(tmpResult, ',', ' '); tmpResult := DeleteRepeat(tmpResult, ' ', ' '); Result := tmpResult; end; class function TString.DeleteRepeat(AOldString: string; ADeleteString, ARepeat: Char): string; var I: Integer; tmpfind1: Boolean; begin tmpfind1 := False; for I := Length(AOldString) downto 1 do begin if tmpfind1 then begin if AOldString[I] = ADeleteString then Delete(AOldString, I, 1) else begin if AOldString[I] = ARepeat then Continue; tmpfind1 := AOldString[I] = ADeleteString; end; end else begin if ADeleteString <> ARepeat then if AOldString[I] = ARepeat then Continue; tmpfind1 := AOldString[I] = ADeleteString end; end; Result := AOldString; end; class function TString.DeleteSuffix(AValue: string; FixedString: TCharSet): string; begin while System.Length(AValue) > 0 do begin if AValue[System.Length(AValue)] in FixedString then Delete(AValue, System.Length(AValue), 1) else Break; end; Result := AValue; end; class procedure TString.GetAllWord(AValue, ASeparator: string; AStringList: TStrings); var tmpWord: string; begin if AStringList = nil then AStringList := TStringList.Create; while Length(AValue) > 0 do begin tmpWord := ''; Delete(AValue, 1, GetFirstWord(AValue, tmpWord, ASeparator)); if tmpWord <> '' then AStringList.Add(tmpWord) else Break; end; end; class function TString.IfThen(AExpression: Boolean; ATrue, AFalse: string): string; begin if AExpression then Result := ATrue else Result := AFalse; end; class function TString.AbsoluteToRelate(AAbsolute, ACurrent: string): string; var tmpSimilarString: string; AOldFile: string; i: Integer; tmpPos: Integer; begin //轉換後形成 ..\..\a.ini; //如果不在同一個驅動器上,則直接返回絕對路徑. if ExtractFileDrive(AAbsolute) <> ExtractFileDrive(ACurrent) then Result := AAbsolute else begin tmpSimilarString := ''; AOldFile := AAbsolute; AAbsolute := ExtractFilePath(AAbsolute); tmpPos := SimilarPosition(AAbsolute, ACurrent); Delete(AOldFile, 1, tmpPos - 1); Delete(ACurrent, 1, tmpPos - 1); for i := 0 to GetCharNum(ACurrent, '\') -1 do begin tmpSimilarString := tmpSimilarString '..\'; end; Result := tmpSimilarString AOldFile; end; end; class function TString.RelateToAbsolute(ARelate, ACurrent: string): string; var tmpSimilarString: string; tmpRootCount: Integer; i: Integer; begin if Length(ARelate) > 2 then begin if ARelate[2] = ':' then begin Result := ARelate; Exit; end; end; tmpSimilarString := ''; tmpRootCount := 0; while True do begin if LeftStr(ARelate, 3) = '..\' then begin Inc(tmpRootCount); Delete(ARelate, 1, 3); end else break; end; tmpSimilarString := ReverseString(ExtractFilePath(ACurrent)); for i := 0 to tmpRootCount do begin Delete(tmpSimilarString, 1, Pos('\', tmpSimilarString)); end; Result := ReverseString(tmpSimilarString) ARelate; end; class function TString.SimilarPosition(AOne, ATwo: string): Integer; var i: Integer; Max: Integer; begin if Length(AOne) < Length(ATwo) then Max := Length(AOne) else Max := Length(ATwo); for i := 1 to Max do begin if AOne[i] <> ATwo[i] then Break; end; Result := i; end; class function TString.GetCharNum(AString: string; AChar: Char): Integer; var i: Integer; begin Result := 0; for i := 1 to Length(AString) do begin if AString[i] = AChar then Inc(Result); end; end; class procedure TString.GetAllWordWithAll(AValue, ASeparator: string; AStringList: TStrings); var tmpI: Integer; tmpPos: Integer; begin if AStringList = nil then AStringList := TStringList.Create; tmpPos := 0; while Length(AValue) > 0 do begin for tmpI := 1 to Length(AValue) do begin tmpPos := Pos(AValue[tmpPos], ASeparator); if tmpPos > 0 then begin AStringList.Add(Copy(AValue, 1, tmpPos - 1)); AStringList.Add(Copy(AValue, tmpPos, 1)); Delete(AValue, 1, tmpPos); Break; end end; end; // while end; class function TString.toLowerCase(AString: string): string; begin Result := LowerCase(AString); end; class function TString.toUpperCase(AString: string): string; begin Result := Uppercase(AString); end; class function TString.IndexOf(AString, ASubString: string): Integer; begin Result := Pos(ASubstring, AString); end; class function TString.ZeroToInt(AString: string): Integer; begin if Trim(AString) = '' then AString := '0'; Result := StrToInt(AString); end; class function TString.ZeroToFloat(AString: string): Double; begin if Trim(AString) = '' then AString := '0.0'; Result := StrToFloat(AString); end; class function TString.SameText(AString, AString1: string): Boolean; begin Result := SysUtils.SameText(AString, AString1); end; class function TString.Reverse(AString: string): string; begin Result := ReverseString(AString); end; class function TString.IsValidIP(const S: String): Boolean; var j, i: Integer; LTmp: String; begin Result := True; LTmp := Trim(S); for i := 1 to 4 do begin j := StrToIntDef(Fetch(LTmp, '.'), -1); Result := Result and (j > -1) and (j < 256); if NOT Result then begin Break; end; end; end; class function TString.ZeroToStr(AString: string): string; begin if Trim(AString) = '' then Result := '0' else Result := AString; end; class function TString.FillString(AChar: Char; ALength: Integer): string; var i: Integer; begin Result := ''; for I := 1 to ALength do // Iterate begin Result := Result AChar; end; // for end; class function TString.StuffString(const AText: string; AStart, ALength: Cardinal; const ASubText: string): string; begin Result := StrUtils.StuffString(AText, AStart, ALength, ASubText); end; class function TString.GetNextString(var SourceString: string; ASplitChar: string): string; var tmpPos: Integer; begin tmpPos := Pos(ASplitChar, SourceString); if tmpPos = 0 then begin Result := SourceString; SourceString := '' end else begin Result := TString.Left(SourceString, tmpPos -1); Delete(SourceString, 1, tmpPos); end; end; { TInteger } class function TInteger.IntToStr(AInteger: Integer): string; begin Result := Sysutils.IntToStr(AInteger); end; class function TInteger.HashCode(AInteger: Integer): Integer; begin Result := AInteger; end; class function TInteger.IntToStr(AInteger: Int64): string; begin Result := Sysutils.IntToStr(AInteger); end; class function TInteger.IsValidInt(AString: string): Boolean; begin Result := True; try StrToInt(AString); except Result := False; end; end; class function TInteger.IsValidInt64(AString: string): Boolean; begin Result := True; try StrToInt(AString); except Result := False; end; end; class function TInteger.MaxInt: Integer; begin Result := System.MaxInt; end; class function TInteger.MaxLongInt: Integer; begin Result := System.MaxLongint; end; class function TInteger.IntToBin(AInteger: Cardinal): string; var i: Integer; begin SetLength(Result, 32); for i := 1 to 32 do begin if ((AInteger shl (i-1)) shr 31) = 0 then Result[i] := '0' else Result[i] := '1'; end; end; class function TInteger.IntToHex(AInteger: Integer): string; begin Result := SysUtils.IntToHex(AInteger, 0); end; class function TInteger.HexToInt(AString: string): Integer; begin if TString.Left(AString, 1) = '$' then Result := StrToInt(AString) else Result := StrToInt('$' AString); end; class function TInteger.MakeSerialNo(AInteger, ADigit: Integer): string; var tmpStr: string; i: Integer; begin tmpStr := ''; for I := 0 to ADigit - 1 do // Iterate begin tmpStr := tmpStr '0'; end; // for Result := FormatFloat(tmpStr, AInteger); end; { TFloat } class function TFloat.FloatToMoney(const Value: Double; Round: Boolean): string; begin //金額默認採用四捨五入 end; class function TFloat.IsValidFloat(AString: string): Boolean; begin Result := True; try StrToFloat(AString); except Result := False; end; end; class function TFloat.MaxDouble: Double; begin Result := 1.7e 308; end; class function TFloat.MaxExtended: Extended; begin Result := 1.1e 4932; end; class function TFloat.MinDouble: Double; begin Result := 5.0e-324; end; class function TFloat.MinExtended: Extended; begin Result := 3.4e-4932; end; class function TFloat.SameValue(const A, B: Single; Epsilon: Single): Boolean; begin Result := Math.SameValue(A, B, Epsilon); end; class function TFloat.SameValue(const A, B: Double; Epsilon: Double): Boolean; begin Result := Math.SameValue(A, B, Epsilon); end; class function TFloat.SameValue(const A, B: Extended; Epsilon: Extended): Boolean; begin Result := Math.SameValue(A, B, Epsilon); end; { TBoolean } class function TBoolean.BoolToStr(ABoolean: Boolean): string; begin if ABoolean then Result := 'True' else Result := 'False'; end; class function TBoolean.StrToBool(AString: string): Boolean; begin if UpperCase(AString) = 'TRUE' then Result := True else Result := False; end; end. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |