Нашел баг в ASP.NET:
Выражение
<asp:BoundField DataField="A" HeaderText="A" ReadOnly="True" Sortexprеssion="A" DataFormatString="{0:n}" >
отображается образом, отличным от выражения
<asp:TemplateField HeaderText="A" Sortexprеssion="A">
...
<ItemStyle HorizontalAlign="Right" />
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("A", "{0:n}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Первое в визуальном редакторе можно сконвертировать во второе. Формат {0:n} должен давать десятичную дробь с разделителями тысяч и двумя знаками после десятичного разделителя. В случае первого выражения формат почему-то не играет роли, хотя должен.
Может, я ламер, и это не баг, а фича?