在ASP中将数字格式化为货币.. NET Gridview使用SQL存储过程作为源

本文关键字:使用 Gridview SQL 存储过程 NET 货币 ASP 数字 格式化 | 更新日期: 2023-09-27 18:08:23

我使用SQL Server存储过程作为我的gridview加载时的源。查询有列,结果到数字(钱),我希望数值输出有逗号时,它在gridview加载。最初在SQL中,查询结果没有任何格式,因为我试图练习将格式放在前端。

以前,我能够通过在gridview定义中放置一个边界字段来实现这一点,然后放置属性名称数据字段,根据SQL中的列或别名的名称给出其值。然而,在我的例子中,存储过程列有一个动态别名,因为它产生一个具有特定日期的列(它根据一周中的天数而变化)。

存储过程是这样的(最后一部分)

 set @query = 'select locationd, Name ' +
        ',(SUM(Day1)) as '+ '[' + @sdateVC1 + ']'  +
        ',(SUM(Day2)) as '+ '[' + @sdateVC2 + ']'  +
        ',(SUM(Day3)) as '+ '[' + @sdateVC3 + ']'  +
        ',(SUM(Day4)) as '+ '[' + @sdateVC4 + ']'  +
        ',(SUM(Day5)) as '+ '[' + @sdateVC5 + ']'  +
        ',(SUM(Day6)) as '+ '[' + @sdateVC6 + ']'  +
        ',(SUM(Day7)) as '+ '[' + @sdateVC7 + ']'  +
        ',(SUM(ISNULL(Day1,0)) + SUM(ISNULL(Day2,0)) + SUM(ISNULL(Day3,0)) + SUM(ISNULL(Day4,0)) + SUM(ISNULL(Day5,0)) + SUM(ISNULL(Day6,0)) + SUM(ISNULL(Day7,0)))as ''TOTAL'' ' +  
        ',RANK() over (partition by locationd order by ((SUM(ISNULL(Day1,0)) + SUM(ISNULL(Day2,0)) + SUM(ISNULL(Day3,0)) + SUM(ISNULL(Day4,0)) + SUM(ISNULL(Day5,0)) + SUM(ISNULL(Day6,0)) + SUM(ISNULL(Day7,0)))) DESC) as ''Ranking'' ' +    
        'from #newestWSR4 ' +
        'group by locationd,  Name ' +
        --'order by locationd, Name ' 
         'union all' +
          ' select ''-'', ''TOTAL'',  sum(day1),  sum(day2),  sum(day3), sum(day4), sum(day5),  sum(day6), sum(day7), (SUM(ISNULL(Day1,0)) + SUM(ISNULL(Day2,0)) + SUM(ISNULL(Day3,0)) + SUM(ISNULL(Day4,0)) + SUM(ISNULL(Day5,0)) + SUM(ISNULL(Day6,0)) + SUM(ISNULL(Day7,0))), ''-''    ' +
          'from #newestWSR4 '

ASP.net中的gridview代码是这样的

<asp:GridView ID="grdWSR" runat="server" BackColor="White" BorderColor="#DEDFDE" 
    BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black"
    GridLines="Vertical" Font-Size="Smaller" EmptyDataText="No Records Found" 
    ShowHeaderWhenEmpty="True" width="100%" AutoGenerateColumns="false" >
<emptydatarowstyle backcolor="white" forecolor="black"/> 
<emptydatatemplate> No Data Found.</emptydatatemplate> 
 <AlternatingRowStyle BackColor="White" />
  <Columns>
     <asp:BoundField  DataField="locationd" />
     <asp:BoundField  DataField="name"   />
     <asp:BoundField Datafield=""  DataFormatString="{0:#,##0.00;(#,##0.00);0}" />
   </Columns>
   <FooterStyle BackColor="#CCCC99" />
   <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" Height="25px"/>
 <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
 <RowStyle BackColor="#F7F7DE" />
 <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
 <SortedAscendingCellStyle BackColor="#FBFBF2" />
 <SortedAscendingHeaderStyle BackColor="#848384" />
 <SortedDescendingCellStyle BackColor="#EAEAD3" />
 <SortedDescendingHeaderStyle BackColor="#575357" />
</asp:GridView>

请注意上面代码中的这一部分

 <asp:BoundField  DataField="locationd" />
 <asp:BoundField  DataField="name"   />
 <asp:BoundField  Datafield="" DataFormatString="{0:#,##0.00;(#,##0.00);0}" />

可以看到,为了测试的目的,我只放了三个边界域。在那里我不知道什么放在数据字段值,因为,别名列在SQL存储过程是动态变化或不固定,不像前两个boundfields(其中列名称/别名在SQL是固定的)

这种情况可能有答案吗?或者我现在是否应该考虑在后端(SQL)上执行解决方案以实现我想要的结果?

任何帮助将非常感激!

在ASP中将数字格式化为货币.. NET Gridview使用SQL存储过程作为源

我建议你不要在sp中做任何格式化的事情,它会使你的系统在优化方面超负荷,

更喜欢c#而不是

    DataTable dt=mySP();
    for(i=0;i<dt.Rows.Count;i++)
    {
    dt.Rows[i][10]=Convert.ToDouble(dt.Rows[i][10]).ToString("#,###,###,###,###,##0.00");
    }
    GridView1.DatSource=dt;

尝试在存储过程中像这样格式化字符串:

CONVERT(varchar, CAST(SUM(Day1) AS money), 1)

或者像这样-

FORMAT(SUM(Day1),'###,###,###')