本帖最后由 Felix.Li 于 2024-7-4 15:56 编辑
===前言=== 熟悉仪表板的同学 都应该用过仪表板的 自动单位功能,如图: 数据单位会自动根据数值切换成(万/亿),并自动保留1位小数 而本帖会通过【自定义函数】功能,在报表中实现相同的效果
===实现步骤=== 1.打开后台管理 → 系统设置 → 报表设置 → 自定义函数,添加如下内容
- /// <function name="AutoFormat">
- /// <culture>
- /// <label>AutoFormat</label>
- /// <syntax>AutoFormat(object number, string unit = "", string format = "")</syntax>
- /// <description>自动转换中文单位</description>
- /// <example>AutoFormat(100) = 100
- /// AutoFormat(100000,"万") = 10.0万 (万与亿自动单位 1位小数)
- /// AutoFormat(100000,"万","0:0.00") = 10.00万 (可以用第二个参数自定义小数位数和格式化)
- /// </example>
- /// </culture>
- /// </function>
- public string AutoFormat(object number, string unit = "", string format = "")
- {
- // 文本对应的数值单位
- System.Collections.Generic.Dictionary<string, decimal> unitDic = new System.Collections.Generic.Dictionary<string, decimal>() {
- {"百",100},{"千",1000},{"万",10000},{"十万",100000},{"百万",1000000},{"千万",10000000},{"亿",100000000},{"十亿",1000000000},{"万亿",1000000000000}
- };
- if (number == null)
- return string.Empty;
- try
- {
- // 如果不传单位,就根据数值自动判断单位(亿和万)
- var result = Convert.ToDecimal(number);
- if (string.IsNullOrWhiteSpace(unit))
- {
- if (Math.Abs(result) >= 100000000)
- {
- unit = "亿";
- }
- else if(Math.Abs(result) >= 10000)
- {
- unit = "万";
- }
- }
-
- if (unitDic.ContainsKey(unit))
- {
- // 如果是有文字单位,自动保留1位小数
- if (string.IsNullOrEmpty(format)) format = "{0:0.0}";
- return String.Format(format + unit, result / unitDic[unit]);
- }
- // 如果传了format,就用format,如果没有传就用自带toString()
- return string.IsNullOrWhiteSpace(format)? result.ToString():String.Format(format, result);
- }
- catch (Exception e)
- {
- return "AutoFormat转换错误"+e.Message;
- }
- }
复制代码
2.编译并保存
3.然后报表中可以通过 Code.AutoFormat 来使用
===举个栗子===
报表中代码如下: 1.自动单位, 不加参数时, 小于一万 不处理 | {Code.AutoFormat(123.45)} | 2.自动, 不加参数时, 万和亿自动一位小数, 四舍五入 | {Code.AutoFormat(12345.67, "", "")} | 3.手动指定某个单位 | {Code.AutoFormat(12345, "千", "")} | 4.自动单位+格式化,保留3位小数 | {Code.AutoFormat(12345.6789, "", "{0:0.000}")} | 5.手动指定单位+四舍五入小数部分 | {Code.AutoFormat(12345.6789, "百", "{0:0}")} |
|