protected virtual void ReadRecordField(DictionaryState state, TableDescriber table, FieldDefinition fieldDefinition, string[] fields)
{
if (fieldDefinition.StartPosition >= fields.Length)
{
if (fieldDefinition.IsOptional) return;
throw new MessagingException("Message does not match definition. Too few fields in current record.");
}
if (fields[fieldDefinition.StartPosition].StartsWith("\"") && fields[fieldDefinition.StartPosition].EndsWith("\"")) // Remove quotes
{
fields[fieldDefinition.StartPosition] = fields[fieldDefinition.StartPosition].Substring(1, fields[fieldDefinition.StartPosition].Length - 2);
}
var describer = new ColumnDescriber(fieldDefinition.Name, table);
if (fieldDefinition.Type.IsIn(FieldDefinitionType.DateTime))
{
state[describer] = DateTime.ParseExact(fields[fieldDefinition.StartPosition].Trim('"'), fieldDefinition.Format, CultureInfo.InvariantCulture);
}
else if (fieldDefinition.Type.IsIn(FieldDefinitionType.Amount, FieldDefinitionType.InvertedAmount, FieldDefinitionType.Decimal))
{
object oldvalue;
decimal oldAmount = state.TryGetValue(describer, out oldvalue) && oldvalue is decimal
? (decimal) oldvalue
: 0;
decimal amount = !string.IsNullOrWhiteSpace(fields[fieldDefinition.StartPosition].Trim('"'))
? Decimal.Parse(fields[fieldDefinition.StartPosition].Trim('"'),
fieldDefinition.Format.IsNullOrEmpty() ? CultureInfo.InvariantCulture : new CultureInfo(fieldDefinition.Format))
: 0;
if (fieldDefinition.Type == FieldDefinitionType.InvertedAmount) amount *= -1;
state[describer] = oldAmount + amount;
}
else if (fieldDefinition.Type == FieldDefinitionType.AmountSign)
{
if (IsNegativeAmountSign(fields[fieldDefinition.StartPosition], fieldDefinition))
{
state[describer] = Decimal.Negate(((decimal)state[describer]));
}
}
else
{
object oldvalue;
state[describer] = state.TryGetValue(describer, out oldvalue)
? oldvalue + " " + fields[fieldDefinition.StartPosition]
: fields[fieldDefinition.StartPosition];
}
}