ASP.NET/C# Decimal a 0.00
Pregunta
Obtuve este método, ¿cómo puedo hacer el decimal a .00 y no 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;
}
ACTUALIZACIÓN: Lo siento por hacer preguntas estúpidas. No puedo ver dónde colocar el DataFormatString = " {0: F2} "
Esta es mi cuadrícula:
<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>
Solución
No has mostrado dónde estás mostrando estos. Todo lo que tenemos es una celda de base de datos y un objeto en la memoria, ambos de los cuales son meramente de almacenamiento. Para fines de almacenamiento, .00
y .0000
son lo mismo. Intentar traducir de uno a otro es un desperdicio de recursos. Muéstrenos dónde le muestra esto al usuario y le ayudaremos a formatearlo como desee.
También, como preferencia personal, escribiría ese código así:
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();
}
}
}
}
Actualización:
Comentaste que esto estará en un GridView. Bueno. En ese caso, todo lo que necesita hacer es tener un DataFormatString
en la definición de la columna, como esto:
<asp:GridView runat="server" id="TestView" ... >
<Columns>
<asp:BoundField DataFormatString="{0:F2}" />
...
</Columns>
</asp:GridView>
Otros consejos
1234m.ToString (" 0,00 ")
Al imprimir Product.Price, use .ToString (" N2 "). Lo que podría desear es la expresión de moneda completa, que es .ToString (" C "). Aquí hay un enlace de referencia para todas las cadenas de formato:
Bueno, obviamente no podrías hacer lo siguiente
product.Price = Convert.ToDecimal(reader["Price"]).ToString("0.00");
ya que devolvería una cadena. Aunque puedes hacer esto:
product.Price = Convert.ToDecimal(reader["Price"].ToString("0.00"));
Esto parece la forma más lógica de completar esta operación.
¿Te preocupa la configuración cultural?
Echa un vistazo a este enlace msdn: http://msdn.microsoft.com/en-us/library/dwhawy9k. aspx
Esperemos que te ayude.