080425 - 문자 삭제에 따른 이전 '-' 위치 값 변경 수정 ExtractFloat 추가
숫자에 사용되는 문자('-', '.') 에 대한 처리가 되어있다.
일반적인 변환에 관해서는 StrToInt 가 더 빠르게 동작하므로, 예외 상황이 가끔 발생하는 경우 TryStrToint 를 이용한 뒤 변환되지 않은 경우 적용하면 된다.
// Int64 의 경우 반환 형태만 Int64 로 바꾸면된다. function ExtractInteger(Str: String): Integer; var I: Integer; H: Integer; begin H := 0; for I := Length(Str) downto 1 do begin if ('0' <= Str[I]) and (Str[I] <= '9') then begin if H > I then begin Delete(Str, H, 1); H := 0; end; end else if Str[I] = '.' then begin Delete(Str, I, Length(Str) - I + 1); if H > 0 then Dec(H); end else if Str[I] = '-' then H := I else begin Delete(Str, I, 1); if H > 0 then Dec(H); end; end; Val(Str, Result, H); end;
// __int64 의 경우 반환형태를 __int64 로 바꾸고, 반환시 StrToInt64 로 변환하면 된다. int __fastcall ExtractInteger(String Str) { int H = 0; for (int i = Str.Length() + 1; --i; ) { if ('0' <= Str[i] && Str[i] <= '9') { if (H > i) { Str.Delete(H, 1); H = 0; } } else if (Str[i] == '.') { Str.Delete(i, Str.Length() - i + 1); if (H > 0) H--; } else if (Str[i] == '-') H = i; else { Str.Delete(i, 1); if (H > 0) H--; } } return StrToInt(Str); }
// ExtratInteger 에 '.' 위치에 따른 처리를 넣었다. function ExtractFloat(Str: String): Extended; var I: Integer; H: Integer; D: Integer; begin H := 0; D := 0; for I := Length(Str) downto 1 do begin if ('0' <= Str[I]) and (Str[I] <= '9') then begin if H > I then begin Delete(Str, H, 1); H := 0; if D > 0 then Dec(D); end; end else if Str[I] = '.' then begin if D > 0 then begin Delete(Str, D, 1); if H > 0 then Dec(H); end; D := I; end else if Str[I] = '-' then begin H := I end else begin Delete(Str, I, 1); if D > 0 then Dec(D); if H > 0 then Dec(H); end; end; TextToFloat(PChar(Str), Result, fvExtended); end;
// ExtratInteger 에 '.' 위치에 따른 처리를 넣었다. Extended __fastcall ExtractFloat(String Str) { int H = 0, D = 0; for (int i = Str.Length() + 1; --i; ) { if ('0' <= Str[i] && Str[i] <= '9') { if (H > i) { Str.Delete(H, 1); H = 0; if (D > 0) D--; } } else if (Str[i] == '.') { if (D > 0) { Str.Delete(D, 1); if (H > 0) H--; } D = i; } else if (Str[i] == '-') H = i; else { Str.Delete(i, 1); if (H > 0) H--; if (D > 0) D--; } } return StrToFloat(Str); }