这两天要开发自定义报表,使用简单账表进行开发。开发过程中,客户发现数值列没有千分符,不利于查看,不直观。然后就针对某一张报表进行开发表单插件,进行数值列千分符的处理。然后发现每个报表(财务报表颇多)都要千分符处理的要求,处理千分符逻辑是一样的。难道每个报表都写一个表单插件?No,显然不符合多年软件Teacher的风格,所以写了一个报表通用的处理千分符的插件代码(思路用到了正则表达式)。给新手小虾米们参考参考。交流QQ:87283202 凯文
修改:
1、过滤掉序号列的处理
2、只对数值类型的decimal,float,int进行处理
/// <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)
{
if (args.Value is decimal || args.Value is float)
{
var val_data = Convert.ToDecimal(args.DataRow[args.Header.Key]);
var round_data = Decimal.Round(val_data, 2);
args.FormateValue = GetDecimalFormatString(round_data, 2);
}
else if (args.Value is int)
{
var val_data = Convert.ToDecimal(args.DataRow[args.Header.Key]);
args.FormateValue = GetDecimalFormatString(val_data);
}
}
}
}
/// <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);
}
}
如果有新手小虾米不知道如何挂表单插件的话,请在社区搜索简单账表二开,有详细的指导步骤。