internal static Boolean FindAndReplacePreciseTimeSource()

in csharp/EPAM.Deltix.HdTime/Formatter.cs [283:338]


		internal static Boolean FindAndReplacePreciseTimeSource(
			String source,
			out Byte preciseTimeSource,
			out Int32 preciseTimeDigitsCount,
			out Int32 preciseTimeDigitsPosition)
		{
			Int32 digitSequenceCount = 0;
			Int32 endOfSequencePosition = -1;
			for (Int32 index = 0; index < source.Length; index++)
			{
				// find sequence of 8 or 9 digits in source
				Char symbol = source[index];
				if (Char.IsDigit(symbol))
				{
					digitSequenceCount++;
				}
				else
				{
					// stop, if sequence is already found
					if (digitSequenceCount > DateTimeFormatSymbolsCount)
					{
						endOfSequencePosition = index - 1;
						break;
					}

					digitSequenceCount = 0;
				}
			}

			// in case, if the sequence is in the end of the source
			if (endOfSequencePosition == -1)
			{
				if (digitSequenceCount > DateTimeFormatSymbolsCount)
				{
					endOfSequencePosition = source.Length - 1;
				}
				else
				{
					preciseTimeSource = 0;
					preciseTimeDigitsCount = preciseTimeDigitsPosition = 0;
					return false;
				}
			}

			// count digits positions
			preciseTimeDigitsCount = digitSequenceCount - DateTimeFormatSymbolsCount;
			preciseTimeDigitsPosition = endOfSequencePosition - preciseTimeDigitsCount + 1;

			// get digits of nanoseconds
			preciseTimeSource = (Byte) ConstructNumberFromChars(source, preciseTimeDigitsPosition, preciseTimeDigitsCount, 2);
			
			// replace digits of nanoseconds with '1'. it helps to avoid incorrect DateTime.Parse rounding of ticks.
			ReplaceChars(source, preciseTimeDigitsPosition, preciseTimeDigitsCount, '1');

			return true;
		}