Asp.Net-Core - OutputFormatter将十进制结果格式化为两位小数

时间:2017-03-07 19:56:50

标签: c# asp.net-core asp.net-core-webapi

我正在为类的十进制类型属性实现自定义输出格式化程序,它应该总是返回两个小数位。 例如:value = 5,那么它应该是5.00。 我在Asp.net Core中创建自定义OutputFormatter,但是,当我为CanWriteType应用覆盖时,我的代码方法(WriteResponseBodyAsync)永远不会被命中。如果我删除了CanWriteType方法,那么它会命中WriteResponseBodyAsync方法,但context.Object包含所有类,而不仅仅包含它的十进制属性。

如何使此OutputFormatter与响应中的所有小数属性一起使用? 任何帮助将不胜感激。

public class CustomDecimalFormatter : OutputFormatter
{
    public string ContentType { get; private set; }
    public CustomDecimalFormatter(){
        ContentType = "application/json";
        SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));

        }

    protected override bool CanWriteType(Type type)
    {
        return type == typeof(decimal);
    }

    public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
    {
        var response = context.HttpContext.Response;
        var decimalValue = (decimal)context.Object;

        var formatted = decimalValue.ToString("F2", CultureInfo.InvariantCulture);

        using (var writer = new StreamWriter(writeStream))
        {
            writer.Write(formatted);
        }

        return Task.FromResult(0);
    }
}

1 个答案:

答案 0 :(得分:1)

我的方法和类代码中没有任何问题。但是,在CustomDecimalFormatter列表的开头添加OutputFormatters可以解决问题。要实现此目的,请在Startup.cs中的ConfigureServices方法中添加以下代码:

services.AddMvc( options => {
                 options.OutputFormatters.Insert(0,new CustomDecimalFormatter());
            });