in csharp/EPAM.Deltix.HdTime/Formatter.cs [233:280]
internal static void ExtractAndReplacePreciseTimeSource(
ref String timeSource,
Int32 preciseTimeFormatPosition,
Int32 preciseTimeFormatSymbolsCount,
Boolean isLowerCaseFormat,
out Byte preciseTimeSource,
out Int32 preciseTimeSourceSymbolsCount)
{
Boolean isUpperCaseFormat = !isLowerCaseFormat;
// find
Int32 preciseTimeSourcePosition = 0;
preciseTimeSourceSymbolsCount = isUpperCaseFormat
? FindPreciseTimeSourceLength(timeSource, preciseTimeFormatPosition, preciseTimeFormatSymbolsCount, out preciseTimeSourcePosition)
: preciseTimeFormatSymbolsCount;
// extract
preciseTimeSource = (Byte)ConstructNumberFromChars(
timeSource,
isUpperCaseFormat ? preciseTimeSourcePosition : preciseTimeFormatPosition, // if upper case, we use changed source position. it is <= preciseTimeFormatPosition.
preciseTimeSourceSymbolsCount,
preciseTimeFormatSymbolsCount == 1 ? 2 : preciseTimeFormatSymbolsCount //
);
// in case when there is lossy upper case format and the last byte is lost.
// we do not need additional F symbol in format
// because parsing exact in DateTime will fail. (format will not be as the source).
if (isUpperCaseFormat && preciseTimeSource % 10 == 0) // some part of source can be lost.
{
if (preciseTimeSource == 0)
{ // preciseTime.TimestampModulo == 0 => we insert special symbols foreach expected nanos format symbol.
// There are can be 2 or 1 symbols. Depends on preciseTimeFormatSymbolsCount
timeSource = timeSource.Insert(preciseTimeSourcePosition, preciseTimeFormatSymbolsCount == 2 ? DoubledSupersedingStirng : SupersedingString);
}
else
{
if (preciseTimeFormatSymbolsCount == 2) // only ones is lost. so we insert special symbol onto the ones position.
{
timeSource = timeSource.Insert(preciseTimeSourcePosition + 1, SupersedingString);
}
}
}
// replace existing nano source chars.
ReplaceChars(timeSource, preciseTimeFormatPosition, preciseTimeSourceSymbolsCount, SupersedingChar);
// we do not need to remember the length of the preciseTimeSourceLength
// we can find out from preciseTimeSource, preciseTimeFormatPosition, preciseTimeFormatSymbolsCount and isLowerCaseFormat
}