Linqpad数值字段截断至指定小数位支持及替代方案问询
LINQPad 数值字段输出截断配置与批量处理方案
一、LINQPad 是否支持内置的数值字段截断配置?
LINQPad的结果设置中,目前没有像DateTime那样可以全局配置数值字段保留指定小数位数的选项。它的结果格式化逻辑主要针对日期、集合展示等场景,数值类型默认会按自身精度输出,没有全局截断的开关。
二、批量处理大量double属性的方案
如果对象包含上百个double属性,不想重复编写Math.Round(obj.Property, 4, MidpointRounding.ToZero)这类代码,可以用以下几种高效方式处理:
1. 反射批量修改属性值
通过反射遍历对象的所有double类型属性,统一执行截断逻辑:
public static T TruncateDoubleProperties<T>(T targetObj, int decimalPlaces = 4) { if (targetObj == null) return targetObj; var doubleProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.PropertyType == typeof(double) && p.CanWrite); foreach (var prop in doubleProperties) { var originalValue = (double)prop.GetValue(targetObj); var truncatedValue = Math.Round(originalValue, decimalPlaces, MidpointRounding.ToZero); prop.SetValue(targetObj, truncatedValue); } return targetObj; }
使用时直接传入对象即可:
var processedObject = TruncateDoubleProperties(yourLargeObject); processedObject.Dump();
注意:如果是值类型对象,需接收返回的新实例;引用类型则会直接修改原对象的属性值。
2. 自定义LINQPad输出格式化器
无需修改原对象数据,仅在Dump()输出时自动截断double属性:
void Main() { var targetObj = new YourLargeDataType { PropA = 3.1415926, PropB = 2.7182818, // ... 其他上百个属性 }; targetObj.Dump(); } // 自定义格式化器 public class DoubleTruncFormatter : ICustomMemberFormatter { public string FormatValue(object value, string formatString, bool isEnumerable) { if (value is double num) { return Math.Round(num, 4, MidpointRounding.ToZero).ToString(); } return null; // 其他类型用默认格式化逻辑 } } // 注册格式化器到目标类型 static DoubleTruncFormatter() { CustomMemberFormatter.Register<YourLargeDataType>(new DoubleTruncFormatter()); }
3. AutoMapper批量映射到DTO(保留原数据)
如果允许创建结构一致的DTO类,用AutoMapper配置全局double类型转换规则:
// 定义与原对象结构一致的DTO public class YourLargeDataTypeDto { public double PropA { get; set; } public double PropB { get; set; } // ... 其他上百个属性 } // 配置AutoMapper映射规则 var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<YourLargeDataType, YourLargeDataTypeDto>(); cfg.ForAllMembers(opt => { if (opt.DestinationMemberType == typeof(double)) { opt.MapFrom(src => Math.Round((double)opt.SourceMember.GetValue(src), 4, MidpointRounding.ToZero)); } }); }); var mapper = mapperConfig.CreateMapper(); var formattedDto = mapper.Map<YourLargeDataTypeDto>(yourLargeObject); formattedDto.Dump();
内容的提问来源于stack exchange,提问作者user19989880
相关产品推荐
相关产品推荐

