/// <summary> /// Format this object to a Degrees-Minutes-Seconds string. /// </summary> /// <param name="format"></param> /// <param name="arg"></param> /// <param name="formatProvider"></param> /// <returns></returns> protected override string DoFormat(string format, object arg, IFormatProvider formatProvider) { DegreeMinuteSecond dms = null; if (!DegreeMinuteSecondFormatInfo.TryParse(arg, out dms)) { // Provide default formatting if the argument is not as expected (Double or DegreeMinuteSecond). return(FormatUnexpectedDataType(format, arg)); } var bearing = base.DoFormat(format, dms.Bearing, formatProvider); // Just in case rounding took us up to 360°! return(bearing == null ? "–" : bearing.Replace("360", "0")); }
/// <summary> /// Format this object to a Milliradian (NATO) string. /// </summary> /// <param name="format"></param> /// <param name="arg"></param> /// <param name="formatProvider"></param> /// <returns></returns> protected override string DoFormat(string format, object arg, IFormatProvider formatProvider) { DegreeMinuteSecond dms = null; if (!DegreeMinuteSecondFormatInfo.TryParse(arg, out dms)) { // Provide default formatting if the argument is not as expected (Double or DegreeMinuteSecond). return(FormatUnexpectedDataType(format, arg)); } UpdateScaleFromFormatString(format); var mils = dms.Bearing * (6400 / 360); var m = Math.Round(mils, base.Scale); return(string.Format("{0}{1}{2}", m, base.Separator, this.MilsSymbol)); }
/// <summary> /// Format this object to a Degrees-Minutes-Seconds string. /// </summary> /// <param name="format"></param> /// <param name="arg"></param> /// <param name="formatProvider"></param> /// <returns></returns> protected override string DoFormat(string format, object arg, IFormatProvider formatProvider) { DegreeMinuteSecond dms = null; if (!DegreeMinuteSecondFormatInfo.TryParse(arg, out dms)) { // Provide default formatting if the argument is not as expected (Double or DegreeMinuteSecond). return(FormatUnexpectedDataType(format, arg)); } DegreeMinuteSecond degreeMinuteSecond = dms.Degrees < 0 ? new DegreeMinuteSecond(Math.Abs(dms.Degrees)) : dms; string latitude = base.DoFormat(format, degreeMinuteSecond, formatProvider); string cardinal = dms.Degrees < 0 ? Direction.South : Direction.North; return(latitude == null ? "–" : latitude + base.Separator + cardinal); }
/// <summary> /// Format this object to a Compass Point string. /// </summary> /// <param name="format"></param> /// <param name="arg"></param> /// <param name="formatProvider"></param> /// <returns></returns> protected override string DoFormat(string format, object arg, IFormatProvider formatProvider) { DegreeMinuteSecond dms = null; if (!DegreeMinuteSecondFormatInfo.TryParse(arg, out dms)) { // Provide default formatting if the argument is not as expected (Double or DegreeMinuteSecond). return(FormatUnexpectedDataType(format, arg)); } // No of compass points at required precision (1=>4, 2=>8, 3=>16). var n = 4 * Math.Pow(2, _precision - 1); double cardinalIndex = Math.Round(dms.Bearing * n / 360) % n * 16 / n; var cardinal = Cardinals[(int)cardinalIndex]; return(cardinal); }
/// <summary> /// Format this object to a Degrees-Minutes-Seconds string. /// </summary> /// <param name="format"></param> /// <param name="arg"></param> /// <param name="formatProvider"></param> /// <returns></returns> protected virtual string DoFormat(string format, object arg, IFormatProvider formatProvider) { if (arg == null) { throw new ArgumentNullException(nameof(arg), "The argument cannot be null."); } DegreeMinuteSecond dms = null; if (!DegreeMinuteSecondFormatInfo.TryParse(arg, out dms)) { // Provide default formatting if the argument is not as expected (Double or DegreeMinuteSecond). return(FormatUnexpectedDataType(format, arg)); } // Adjust for missing format. #pragma warning disable S3900 string f = string.Empty; if (string.IsNullOrWhiteSpace(format)) { // Default to everything. f = "DMS"; } else { f = format.ToUpper(System.Globalization.CultureInfo.CurrentCulture); } #pragma warning restore S3900 UpdateScaleFromFormatString(format); string secondsFormat = "S"; string minutesFormat = "M"; if (f.Contains(secondsFormat)) { return(ToDegreeMinuteSecond(dms)); } else if (f.Contains(minutesFormat)) { return(ToDegreeMinute(dms)); } else { return(ToDegree(dms)); } }