public void TestAvroDecimalToString(decimal value) { var valueString = value.ToString(); var avroDecimal = new AvroDecimal(value); var avroDecimalString = avroDecimal.ToString(); Assert.AreEqual(valueString, avroDecimalString); }
internal override object ConvertToLogicalValue(object baseValue, LogicalTypeSchema schema, Type type) { var buffer = AvroType.Bytes == schema.BaseTypeSchema.Type ? (byte[])baseValue : ((AvroFixed)baseValue).Value; Array.Reverse(buffer); var avroDecimal = new AvroDecimal(new BigInteger(buffer), Scale); return(AvroDecimal.ToDecimal(avroDecimal)); }
internal object ConvertToBaseValue(object logicalValue, DecimalSchema schema) { var avroDecimal = new AvroDecimal((decimal)logicalValue); var logicalScale = Scale; var scale = avroDecimal.Scale; //Resize value to match schema Scale property int sizeDiff = logicalScale - scale; if (sizeDiff < 0) { throw new AvroTypeException( $@"Decimal Scale for value [{logicalValue}] is equal to [{scale}]. This exceeds default setting [{logicalScale}]. Consider adding following attribute to your property: [AvroDecimal(Precision = 28, Scale = {scale})] "); } string trailingZeros = new string('0', sizeDiff); var logicalValueString = logicalValue.ToString(); string valueWithTrailingZeros; if (logicalValueString.Contains(avroDecimal.SeparatorCharacter)) { valueWithTrailingZeros = $"{logicalValue}{trailingZeros}"; } else { valueWithTrailingZeros = $"{logicalValue}{avroDecimal.SeparatorCharacter}{trailingZeros}"; } avroDecimal = new AvroDecimal(valueWithTrailingZeros); var buffer = avroDecimal.UnscaledValue.ToByteArray(); Array.Reverse(buffer); return(AvroType.Bytes == schema.BaseTypeSchema.Type ? (object)buffer : (object)new AvroFixed( (FixedSchema)schema.BaseTypeSchema, GetDecimalFixedByteArray(buffer, ((FixedSchema)schema.BaseTypeSchema).Size, avroDecimal.Sign < 0 ? (byte)0xFF : (byte)0x00))); }
private static void AddDecimal(XContainer parent, AvroDecimal value, string name = null, string nspace = null) { var element = new XElement(XDecimal); if (name != null) { element.SetAttributeValue(XName, name); } if (nspace != null) { element.SetAttributeValue(XNamespace, nspace); } var decimalValue = value.ToType <decimal>(); element.Value = XmlConvert.ToString(decimalValue); parent.Add(element); }