ASP.NET/C# Decimale a 0,00
Domanda
Ho ottenuto questo metodo, come posso fare il decimale a .00 e non a .0000?
public static List<Product> GetAllProducts()
{
List<Product> products = new List<Product>();
string sqlQuery = "SELECT * FROM Products";
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(sqlQuery, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
Product product = new Product();
product.Id = Convert.ToInt32(reader["Id"]);
product.ManufacturerId = Convert.ToInt32(reader["ManufacturerId"]);
product.CategoryId = Convert.ToInt32(reader["CategoryId"]);
product.Name = (reader["Name"]).ToString();
product.Description = (reader["Description"]).ToString();
product.Price = Convert.ToDecimal(reader["Price"]);
product.ItemsInStock = Convert.ToInt32(reader["ItemsInStock"]);
products.Add(product);
}
}
}
}
return products;
}
UPDATE: Scusa per aver fatto domande stupide. Non riesco a vedere dove inserire DataFormatString = " {0: F2} "
Questa è la mia griglia:
<asp:TemplateField HeaderText="Price" SortExpression="Price">
<EditItemTemplate>
<asp:TextBox ID="PriceTextBox" runat="server" Text='<%# Bind("Price") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="PriceLabel" runat="server" Text='<%# Bind("Price") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Soluzione
Non hai mostrato dove li stai visualizzando. Tutto ciò che abbiamo è una cella di database e un oggetto in memoria, che sono entrambi semplicemente archiviazione. Ai fini della memorizzazione, .00
e .0000
sono la stessa cosa. Cercare di tradurre dall'uno all'altro è uno spreco di risorse. Mostraci dove lo mostri all'utente e ti aiuteremo a formattarlo come preferisci.
Inoltre, come preferenza personale scrivo quel codice in questo modo:
private static ToProduct(this IDataRecord record)
{
var product = new Product();
product.Id = record.GetInt32(record.GetOrdinal("Id"));
product.ManufacturerId = record.GetInt32(record.GetOrdinal("ManufacturerId"));
product.CategoryId = record.GetInt32(record.GetOrdinal("CategoryId"));
product.Name = record.GetString(record.GetOrdinal("Name"));
product.Description = record.GetString(record.GetOrdinal("Description"));
product.Price = record.GetDecimal(record.GetOrdinal("Price"));
product.ItemsInStokc = record.GetInt32(record.GetOrdinal("ItemsInStock"));
return product;
}
public static IEnumerable<Product> GetAllProducts()
{
string sqlQuery = "SELECT * FROM Products";
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(sqlQuery, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
yield return reader.ToProduct();
}
}
}
}
Aggiornamento:
Hai commentato che questo sarà in un GridView. Va bene. In tal caso, tutto ciò che devi fare è avere un DataFormatString
nella definizione della colonna, in questo modo:
<asp:GridView runat="server" id="TestView" ... >
<Columns>
<asp:BoundField DataFormatString="{0:F2}" />
...
</Columns>
</asp:GridView>
Altri suggerimenti
1234m.ToString (" 0,00 ")
Quando si stampa Product.Price, utilizzare .ToString (" N2 "). Quello che potresti desiderare è l'espressione di valuta completa, che è .ToString (" C "). Ecco un link di riferimento per tutte le stringhe di formato:
Beh, ovviamente non puoi fare quanto segue
product.Price = Convert.ToDecimal(reader["Price"]).ToString("0.00");
in quanto restituirebbe una stringa. Anche se potresti essere capace di farlo:
product.Price = Convert.ToDecimal(reader["Price"].ToString("0.00"));
Questo sembrerebbe il modo più logico per completare questa operazione.
Sei preoccupato per le impostazioni della cultura?
Dai un'occhiata a questo link msdn: http://msdn.microsoft.com/en-us/library/dwhawy9k. aspx
Spero di darti una mano.