在GridView中显示两位小数

20

我在一个.aspx页面中有一个GridView,展示动态数据,并设置AutoGenerateColumns="True"

根据用户在下拉框中选择的选项,我绑定不同的DataTable到GridView。例如,如果用户选择Persons,则我获取Persons DataTable,如果用户选择Products,则我获取Products DataTable。

如何在GridView中显示带有2位小数的浮点数或双精度数?

7个回答

45

绑定列应该有一个DataFormatString列,你可以这样做:

DataFormatString="{0:0.00}" 数字自定义格式字符串

更新 如果AutoGenerateColumns="true"...我需要了解更多关于你绑定的信息,但以下是一些探索途径:

  1. 我不确定GridView是否会遵循数据注释中的DataFormatAttribute。如果你要绑定一个对象,并且GridView尊重该属性,那可能是一种路线。
  2. 连接RowDataBound事件,检查每个可能存在小数值的列,并进行格式化。

好的,我正在将DataTable绑定到GridView。实际上,根据用户选择的条件,我正在将不同的DataTable绑定到同一个GridView,也就是说,假设下拉框中有两个选项:1.人员和2.产品。因此,如果用户选择了“人员”,那么我会获取“人员”DataTable并将其绑定到GridView;如果用户选择了“产品”,那么我会获取“产品”DataTable并将其绑定到GridView。 - gofor.net
1
似乎这样做可能会带来更多麻烦。你能否拥有两个GridView,一个配置为Persons所需的方式,另一个为Products,只需隐藏一个并在必要时显示另一个?如果不行,您仍然可以在RowDataBound上检查每个列,并根据需要格式化值。 - moribvndvs
谢谢HackedByChinese,实际上我的组合框有8个选项。 :) 但还是谢谢你的即时回复。 - gofor.net

13

你可以在GridView中编写BoundField:

<asp:BoundField DataField="amount" DataFormatString="{0:n}" />

你也可以在GridView中编写TemplateField

<asp:TemplateField>
  <ItemTemplate>
    <%#Eval("amount","{0:n}")%>
  </ItemTemplate>
</asp:TemplateField>

1
我正在尝试这样的代码 - <asp:Label runat="server" ID="Value" Text='<%#Eval("Amount","{0:2}") %>'>'></asp:Label>,但它显示所有值都为2。我错在哪里了? - Silver
我怀疑你需要使用0:n而不是0:2(?)。根据DataFormatStrings文档中的说明,"N或n以数字格式显示数值(包括分组分隔符和可选的负号)。您可以指定小数位数。" - Zeek2
但是在上述方法中,你如何指定小数位数呢? - Zeek2
啊,这样,将位置数放在后面(例如,对于Silver 0:n2)。从DataFormatStrings文档中获取:https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.boundfield.dataformatstring?view=netframework-4.8.1 格式:{0:N4}1234.567 -> 1,234.5670 - Zeek2
不好意思,抱歉这个方法没有起作用。我发现和用户Silver遇到了类似的问题。我尝试使用了Eval("Lat", "0:N4"),但是在我的GridView列中只看到了"0:N4"的显示。啊,我漏掉了花括号,也许这就是问题所在? - Zeek2
不添加花括号只能部分修复它:它返回显示所有小数位,而不仅仅是4位小数。这是我尝试的<%# Eval("Lat", "{0:N4}") %>这次,还有:<%# Bind("Lat", "{0:N4}") %>,但对于任何一个都没有重新格式化数据 :( - Zeek2

12

你可以在绑定字段中使用 DataFormatString="{0:n2}"


2

这适用于模板列,比如说你想要一个小数点后保留两位的比率(比如1:3)

<%# Eval("somedatacolumn", "1:{0:.##}").ToString() %>

1
如果您使用DataFormatString,但似乎效果不佳,可以添加HtmlEncode = "false",例如:
<asp:BoundField DataField="DateScheduled" HeaderText="Date Created"   DataFormatString="{0:D}" HtmlEncode="false"/> // date format
<asp:BoundField DataField="Amount" HeaderText="Pay This Amount" DataFormatString="{0:F}" HtmlEncode="false"/> // number format

很遗憾,对我来说没有起作用(使用VS2019):DataFormatString="{0:f4}" HtmlEncode="false" Text='<%# Bind("Lat", "{0:f4}") %>' - Zeek2
FYI 以上用于<ItemTemplate>部分的标签控件。(即不是一个asp.Boundfield部分,也许这就是区别所在?:() - Zeek2

0

在GridView中有两种简单的格式化方式。第一种方式在之前的答案中已经给出 - 使用DataFormatString。 第二种方式适用于您的情况,即动态加载网格,可以更改进入网格的数据。

因此,不要返回数字并尝试格式化它,而应返回格式化后的数字,让GridView显示它。


0
<asp:TemplateField HeaderText="Prev Salary" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center">
    <ItemTemplate>
        <asp:Label ID="lblGrdSalary" runat="server" Text='<%#Bind("Salary", "{0:n}") %>'></asp:Label>
    </ItemTemplate>
    <HeaderStyle HorizontalAlign="Center"></HeaderStyle>
    <ItemStyle HorizontalAlign="Center" Width="70px" />
</asp:TemplateField>

很遗憾对我没有起作用 :( - Zeek2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接