解析浮点数,小数或双精度

时间:2014-09-19 12:58:59

标签: c# parsing floating-point

我正在重写我们的平面文件解析器,从非通用的,属性导向的东西到更现代的流畅的synstax thingy。我有一个问题想出一个处理浮点数的好方法

鉴于此DTO

public class Foo 
{
   public decimal DecimalValue { get; set; }
}

这个平面文件

1234561234

您可以像这样配置

Mapper.CreateMap<Foo>()
.Map(f => f.DecimalValue)
.Decimal(10, 4); //Length 10, precision 4

反序列化

var result = Mapper<Foo>.Read(flatfile);

它将生成一个foo对象,其属性值为123456.1234

我有这个工作代码,但它只对十进制值进行硬编码。 我正试图找到一个很好的通用方法。一个问题是浮点数没有通用的constaint。

以上示例中的通用Map方法

    public PropertyMapResult<TType, TProperty> Map<TProperty>(Expression<Func<TType, TProperty>> expression)
    {
        var result = new PropertyMapResult<TType, TProperty>(this, expression);
        propertyMappers.Add(result);
        return result;
    }

问题方法Decimal看起来像这样

    public MapResult<TType> Decimal(int length, int precision)
    {
        this.length = length;
        toFormater = s => (TProperty)FormatDecimal(s, precision);
        fromFormater = property => string.Empty; //TODO: fix Writing of decimal, also fix support for double and float

        return parent;
    }

及其基础FormatDecimal

    private object FormatDecimal(string data, int precision)
    {
        var integer = ConvertTo<decimal>(data);
        var frac = (decimal)Math.Pow(10, precision);

        return integer/frac;
    }

一种方法是重载以上所有的方法,每个浮点数类型一个,不是非常优化。我尝试使用FormatDecimal方法进行动态投射,但这没有帮助

有什么想法吗?

0 个答案:

没有答案