【新特性速递】表格列的货币栅格化显示

FineUIPro/Mvc/Core的下个版本(v7.0.0),我们会新增一个表格示例,用来展示如何自定义货币栅格化显示。

 

首先看下示例显示效果:

工资列中,红色竖线表示小数分隔符,绿色竖线表示千分位分隔符。

那么怎么实现这个效果呢?这就需要借助于列渲染函数,并自定义CSS样式。

 

本列的标签定义:

1
<f:RenderField Width="200px" ColumnID="Salary" DataField="Salary" HeaderText="工资" RendererFunction="renderSalary" />

 

列的自定义渲染函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<script>
    // 单元格总数(8, 11, 14)
    var CELL_COUNT = 11;
 
    function renderSalary(value) {
        var result = '', html = [];
 
        var items = (value + '').split('.');
        var integerPart = items[0];
        var decimalPart = items[1];
        result += integerPart;
        if (decimalPart) {
            result += decimalPart.charAt(0) || '0';
            result += decimalPart.charAt(1) || '0';
        } else {
            result += '00';
        }
        var prefixCount = CELL_COUNT - result.length;
        if (prefixCount > 0) {
            for (var i = 0; i < prefixCount; i++) {
                result = '_' + result;
            }
        }
 
        html.push('<table class="currency"><tbody><tr>');
        for (var i = 0; i < CELL_COUNT; i++) {
            var tdCls = '';
            if ((i + 1) % 3 === 0) {
                tdCls = 'separator';
 
                if (i + 1 + 3 > CELL_COUNT) {
                    tdCls += ' lastone';
                }
            }
            var cellValue = result.charAt(i);
            html.push(F.formatString('<td class="{0}">{1}</td>',
                tdCls,
                cellValue === '_' ? ' ' : cellValue));
        }
        html.push('</tr></tbody></table>');
        return html.join('');
    }
 
</script>

这段JavaScript代码稍微有点复杂,我们就以数字 6888.5 为例分析一下。

1. 定义栅格的个数(CELL_COUNT)

8个:6位整数部分,2位小数部分

11个:9位整数部分,2位小数部分

2. 获取整数部分和小数部分

integerPart === '6888'
decimalPart === '5'

3. 生成需要渲染的字符串

result === '00000688850'

4. 循环生成HTML片段

在3位一个分割符的地方,为td标签增加separator样式

如果是最后一个分隔符,除了separator样式类,还需要增加一个lastone样式类,因为这个小数分隔符有别于前面的千分位分隔符。

 

最终生成的HTML片段如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
 <head></head>
 <body>
  <table class="currency">
   <tbody>
    <tr>
     <td> </td>
     <td> </td>
     <td class="separator"> </td>
     <td> </td>
     <td> </td>
     <td class="separator">6</td>
     <td>8</td>
     <td>8</td>
     <td class="separator lastone">8</td>
     <td>5</td>
     <td>0</td>
    </tr>
   </tbody>
  </table>
 </body>
</html>

  

下面就是CSS定义了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.f-grid-cell-Salary .f-grid-cell-inner {
    padding: 0;
}
.currency {
    border-collapse: separate;
    table-layout: fixed;
    width: 100%;
    border-spacing: 0px;
}
.currency td {
    border-right-width:1px;
    border-right-style: solid;
    border-right-color: #ddd;
    text-align: center;
}
.currency td:last-child {
    border-right-color: transparent;
}
.currency td.separator {
    border-right-color: green;
}
.currency td.separator.lastone {
    border-right-color: red;
}

需要注意如下两点:

  • 最后一个栅格右侧边框为透明色,通过 .currency td:last-child 来选择相应节点
  • 小数分隔符的右侧边框为红色,通过 .currency td.separator.lastone 来选择相应节点

  

 

 

欢迎入伙:https://fineui.com/fans/

三石出品,必属精品 

posted @   三生石上(FineUI控件)  阅读(549)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2009-09-16 ExtAspNet应用技巧(二十) - 如何创建ext:Timer控件
点击右上角即可分享
微信分享提示