[ 아래 두 함수에서 사용되는 공용함수 ]
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;
|