这两天要开发自定义报表,使用简单账表进行开发。开发过程中,客户发现数值列没有千分符,不利于查看,不直观。然后就针对某一张报表进行开发表单插件,进行数值列千分符的处理。然后发现每个报表(财务报表颇多)都要千分符处理的要求,处理千分符逻辑是一样的。难道每个报表都写一个表单插件?No,显然不符合多年软件Teacher的风格,所以写了一个报表通用的处理千分符的插件代码(思路用到了正则表达式)。给新手小虾米们参考参考。交流QQ:87283202 凯文
修改1:
1、过滤掉序号列的处理
2、只对数值类型的decimal,float,int进行处理
修改2:
1、合计列进行千分符处理
/// <summary>
/// 【账表表单插件】数字显示千分位
/// </summary>
[Description("【账表表单插件】数字显示千分位"), HotUpdate]
public class Common_AddFormatQianFenFu : AbstractSysReportPlugIn
{
protected string CONST_SEQ_NAME = "FIDENTITYID";
/// <summary>
/// 格式化-处理列值
/// </summary>
/// <param name="args"></param>
public override void FormatCellValue(FormatCellValueArgs args)
{
base.FormatCellValue(args);
if (args.Header.Key == CONST_SEQ_NAME) return; //需要不进行处理
var reResult = new Regex($@"^-?\d*\.?\d+(?:[eE][-+]?\d+)?$");
if (args.DataRow[args.Header.Key] != DBNull.Value)
{
var strInput = args.DataRow[args.Header.Key].ToString();
var actionResult = reResult.Match(strInput);
if (actionResult.Success)
{
var format_digits = 2;
var val_data = Convert.ToDecimal(args.DataRow[args.Header.Key]);
var where_01 = args.CellType == BOS.Core.Enums.BOSEnums.Enu_ReportCellType.Total && args.IsSummaryRow && args.Value.ToString().IndexOf('.') == -1; //合计列的整型处理
var where_02 = args.CellType == BOS.Core.Enums.BOSEnums.Enu_ReportCellType.Normal && !args.IsSummaryRow && args.Value is int; //标准默认数值列整型处理
if (where_01 || where_02)
{
format_digits = 0;
}
args.FormateValue = GetDecimalFormatString(val_data, format_digits);
}
}
}
/// <summary>
/// 格式化数字
/// </summary>
/// <param name="value">格式化的数值</param>
/// <param name="digits">小数点位</param>
/// <returns></returns>
protected string GetDecimalFormatString(decimal value, int format_digits = 0)
{
if (format_digits < 0 || format_digits > 99)
return ObjectUtils.Object2String(value);
var format = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
format.NumberNegativePattern = 1;
format.NumberDecimalDigits = format_digits;
return value.ToString($"N{format_digits}", format);
}
}
如果有新手小虾米不知道如何挂表单插件的话,请在社区搜索简单账表二开,有详细的指导步骤。