public static String Format()

in csharp/EPAM.Deltix.HdTime/Formatter.cs [571:650]


		public static String Format(HdDateTime time, String format, IFormatProvider formatProvider)
		{
			String localFormat;
			bool isDefaultFormat = false;
			if (String.IsNullOrEmpty(format))
			{
				isDefaultFormat = true;
				localFormat = Formatter.GetDefaultFormat();
			}
			else
			{
				localFormat = String.Copy(format); // Does not actually copy an interned string
			}

			Byte timestampModulo = time.TimestampModulo;
			Boolean isZeroModulo = timestampModulo == 0;
			Boolean isZeroModuloTens = timestampModulo / 10 == 0;
			

			// ptf is PreciseTimeFormat
			Int32 ptfPosition, ptfSymbolsCount;
			Boolean isPtfLowerCase;
			Boolean isPtfFound = Formatter.FindPreciseTimeFormat(localFormat, out ptfPosition, out ptfSymbolsCount, out isPtfLowerCase);
			if (!isPtfFound)
			{
				return time.RawDateTime.ToString(format);
			}

			// if format is in the middle.
			if (ptfPosition + ptfSymbolsCount < localFormat.Length)
			{
				throw new FormatException(String.Format("Format {0} is unsupported.", format));
			}

			Boolean isPtfUpperCase = !isPtfLowerCase;
			// case, when we can substring format, because nanoseconds should not be represented in formatting result.
			if (isPtfUpperCase && (isZeroModulo || (ptfSymbolsCount == 1 && isZeroModuloTens)))
			{
				return time.RawDateTime.ToString(localFormat.Substring(0, localFormat.Length - ptfSymbolsCount));	
			}

			Boolean isZeroModuloCount = timestampModulo % 10 == 0 && ptfSymbolsCount == 2;
			if (isPtfUpperCase && isZeroModuloCount)
			{
				localFormat = localFormat.Substring(0, localFormat.Length - 1);
				ptfSymbolsCount--;
			}

			if (isDefaultFormat)
			{
				localFormat = Formatter.PreciseTimeFormatAdjusted;
			}
			else
			{
				if (isPtfUpperCase && ptfSymbolsCount > 0)
					CorrectDateTimeFormat(localFormat, ptfPosition);

				Formatter.ReplaceChars(localFormat, ptfPosition, ptfSymbolsCount, '#');
			}

			Formatter.ReplaceChars(localFormat, ptfPosition, ptfSymbolsCount, '#');

			try
			{
				String dateTimeFormatterResult = time.RawDateTime.ToString(localFormat);
				Formatter.RollbackPreciseTimeSourceReplacement(dateTimeFormatterResult,
					dateTimeFormatterResult.Length - ptfSymbolsCount, ptfSymbolsCount, timestampModulo);

				return dateTimeFormatterResult;
			}
			finally
			{
				if (0 != ptfSymbolsCount && !isDefaultFormat)
					Formatter.RollbackPreciseTimeFormatReplacement(
						localFormat,
						ptfPosition - Formatter.DateTimeFormatSymbolsCount,
						ptfSymbolsCount + Formatter.DateTimeFormatSymbolsCount,
						isPtfLowerCase);
			}
		}