Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[136] Decimal <-> Degree
박정모 [] 4941 읽음    2001-12-27 03:58


[ 아래 두 함수에서 사용되는 공용함수 ]
function Norm( Value : Extended ) : String; // makes decimal number from exponent
var R: TFloatRec;
    I: Integer;
    Sep: String;
    Ini: TINIFile;
begin
  Ini:=TINIFile.Create('win.ini');
  Sep:=Ini.ReadString('intl', 'sDecimal', '.'); // gets decimal separator
  Ini.Free;
  FloatToDecimal(R, Value, fvExtended, 18, 9999);
  Result:=R.Digits;
  if R.Exponent > 0 then
    Insert(Sep, Result, R.Exponent + 1)
  else
  begin
    for I:=1 to -R.Exponent do
      Result:='0' + Result;
    Result:='0' + Sep + Result;
  end;
end;

[ Decimal -> Degree ]
function DecToDMS(Num: String): Extended;
var F, Deg: String;
    Sep: String;
    Ini: TINIFile;
begin
  Ini:=TINIFile.Create('win.ini');
  Sep:=Ini.ReadString('intl', 'sDecimal', '.');
  Ini.Free;
  Deg:=FloatToStr(Int(StrToFloat(Num)));
  if Length(FloatToStr(Frac(StrToFloat(Num)))) = 1 then Exit;
  if Length(FloatToStr(Frac(StrToFloat(Num)))) > 2 then
    Num:=Norm(6 / (10 / Frac(StrToFloat(Num))));
  Num:=Norm(Frac(StrToFloat(Num)));
  F:=Num;
  if Length(F) > 4 then
    Num:=Copy(Num, Pos(Sep, Num), 3) + Copy(Norm(6 / (10 / StrToFloat('0' + Sep + Copy(Num, Pos(Sep, Num) + 3, 18)))), 3, 20);
  Num:=Deg + Copy(Num, Pos(Sep, Num), Length(Num));
  Result:=StrToFloat(Num);
end;

[ Degree -> Decimal ]
function DMSToDec(Num: String): Extended;
var I: Integer;
    Deg, MSec, Sec, Min: String;
    F: String;
    Sep: String;
    Ini: TINIFile;
begin
  Ini:=TINIFile.Create('win.ini');
  Sep:=Ini.ReadString('intl', 'sDecimal', '.');
  Ini.Free;
  Deg:=FloatToStr(Int(StrToFloat(Num)));
  if Deg = '' then Deg:='0';
  MSec:=Copy(Norm(Frac(StrToFloat(Num))), 7, Length(Num));
  Sec:=Copy(Norm(Frac(StrToFloat(Num))), 5, 2);
  Min:=Copy(Norm(Frac(StrToFloat(Num))), 3, 2);
  if Min = '' then Min:='0';
  if Sec <> '' then
  begin
    if StrToInt(Sec) >= 60 then
    begin
      Min:=FloatToStr(StrToFloat(Min) + 1);
      Sec:=FloatToStr(StrToFloat(Sec) - 60);
      if Length(Sec) = 1 then Sec:='0' + Sec;
    end;
  end
  else Sec:='0';
  if Min <> '' then
  begin
    if StrToInt(Min) >= 60 then
    begin
      Deg:=FloatToStr(StrToFloat(Deg) + 1);
      Min:=FloatToStr(StrToFloat(Min) - 60);
      if Length(Min) = 1 then Min:='0' + Min;
    end;
  end;
  Num:=Norm(10 / (6 / Frac(StrToFloat('0' + Sep + Sec + MSec))));
  Num:=Norm(Frac(StrToFloat(Num)));
  F:=Num;
  Num:=Deg + Sep + Copy(Norm(10 / (6 / StrToFloat('0' + Sep + Min + Copy(Num, Pos(Sep, Num) + 1, Length(Num))))),3,20);
  Result:=StrToFloat(Num);
end;



+ -

관련 글 리스트
136 Decimal <-> Degree 박정모 4941 2001/12/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.