在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)上执行解决方案以实现我想要的结果?
任何帮助将非常感激!
我建议你不要在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),'###,###,###')