Decimal degrees do dd°mm'ss"

A quick task - convert decimal degrees back to dd°mm'ss''. Not sure if there are other ways of doing this in manifold at this stage so an active column did the trick.

A script is in c#, so just copy and paste it to the script attached to a table when creating an active column. Then simply put the appropriate method name to be used by a column and that's basically it.

 

using Manifold.Interop.Scripts;
using System;

class Script {

	static string Decimal2Degrees(double decimalDegrees)
	{
		
		int fullDegrees = (int) Math.Floor(decimalDegrees);
		
		double decimalMinutes = (decimalDegrees - fullDegrees) * 60;
		int fullMinutes = (int) Math.Floor(decimalMinutes);

		double decimalSeconds = (decimalMinutes - fullMinutes) * 60;
		int fullSeconds = (int) Math.Round(decimalSeconds);

		string strMinutes = fullMinutes.ToString();
		if(fullMinutes < 10){
			strMinutes = "0" + fullMinutes.ToString();
		}

		string strSeconds = fullSeconds.ToString();
		if(fullSeconds < 10){
			strSeconds = "0" + fullSeconds.ToString();
		}

		return fullDegrees.ToString() + "°" + strMinutes + "'" + strSeconds + "\"";
	}

	static object getLongitude()
	{
		return Decimal2Degrees((double)Context.Record.get_Data("Longitude (I)"));
	}

	static object getLatitude()
	{
		return Decimal2Degrees((double)Context.Record.get_Data("Latitude (I)"));
	}
}

[EDIT] As Adam has pointed out, the code in its first form could return 60 for seconds what of course does not make too much sense. Now, there are a few ways of fixing it - one can use floor and drop the remaining decimal part, or a test can be performed to check if the number of seconds does not exceed 59 seconds, or maybe if the number of seconds rounds to 60 one should increase number of minutes by one and then degrees by one if minutes reach 60 and... Well, to keep it simple at this stage one line of the code needs to be added just after assigning a value to the fullSeconds variable:

fullSeconds = fullSeconds > 59? 59: fullSeconds;

This works as if one used Math.Floor but only if the number rounds to 60. Not perfect for all uses but...

One more thing - as I started thinking a bit more about what the code actually does it appeared to me that for negative coordinates it will return wrong values as it uses Math.Floor - so for -37.50 one will get -38... Living on the northern hemisphere east of Greenwich and not having to deal with negative coordinates on a daily basis, huh?