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;
}