Formatear un flotador a 2 decimales

210

Actualmente estoy construyendo un módulo de ventas para el sitio web de un cliente. Hasta ahora tengo el precio de venta para calcular perfectamente, pero donde me he quedado atascado es formatear la salida a 2 decimales.

Actualmente estoy llamando a esto en una variable para poder vincular los resultados a una vista de lista.

Sale = float.Parse(((x.Sale_Price - (x.Sale_Price * (x.Discount_Price / 100))).ToString())),

¿Alguien puede mostrarme cómo formatear la salida a 2 decimales? ¡Muchas gracias!

Callum
fuente
Comprueba esto, no estoy seguro, pero podría funcionar ToString ("#. ##");
Syeda

Respuestas:

467

Puede pasar el formato al ToStringmétodo, por ejemplo:

myFloatVariable.ToString("0.00"); //2dp Number

myFloatVariable.ToString("n2"); // 2dp Number

myFloatVariable.ToString("c2"); // 2dp currency

Cadenas de formato de número estándar

WraithNath
fuente
38
"N2" y "C2" agregarán miles de separadores mientras que "0.00" no lo hará.
Marc K
55
En caso de que no esté seguro (lo estaba), todas estas formas de formatear un valor flotante proporcionan redondeo.
RenniePet
46

Lo primero que debe hacer es usar el decimaltipo en lugar de floatlos precios. El uso floates absolutamente inaceptable porque no puede representar con precisión la mayoría de las fracciones decimales.

Una vez que haya hecho eso, Decimal.Round()puede usarse para redondear a 2 lugares.

Michael Borgwardt
fuente
36

String.Format("{0:#,###.##}", value)

Un ejemplo más complejo de String Formatting en C # :

String.Format("{0:$#,##0.00;($#,##0.00);Zero}", value);

Esto generará "$ 1,240.00" si se pasa 1243.50. Producirá el mismo formato pero entre paréntesis si el número es negativo, y emitirá la cadena "Cero" si el número es cero.

alexandrul
fuente
4
string outString= number.ToString("####0.00");
danyolgiax
fuente
1
Hay diferentes entre "0" y "#" en formato personalizado. "0": reemplaza el cero con el dígito correspondiente si hay uno presente; de lo contrario, cero aparece en la cadena de resultados. "#": Reemplaza el símbolo "#" con el dígito correspondiente si hay uno presente; de lo contrario, no aparece ningún dígito en la cadena de resultados. Referencia
劉鎮 瑲
3

Como ya se mencionó, deberá utilizar un resultado formateado; que se hace todo a través de los Write(), WriteLine(), Format(), y ToString()métodos.

Lo que no se ha mencionado es el Formato de punto fijo que permite un número específico de lugares decimales. Utiliza una 'F' y el número que sigue a la 'F' es el número de lugares decimales que se muestran, como se muestra en los ejemplos.

Console.WriteLine("{0:F2}", 12);    // 12.00 - two decimal places
Console.WriteLine("{0:F0}", 12.3);  // 12 - ommiting fractions
Jackson
fuente
2

Esto es para los casos en que desea utilizar cadenas interpoladas . De hecho, estoy publicando esto porque estoy cansado de prueba y error y eventualmente me desplazo a través de toneladas de documentos cada vez que necesito formatear un escalar.

$"{1234.5678:0.00}"        "1234.57"        2 decimal places, notice that value is rounded
$"{1234.5678,10:0.00}"     "   1234.57"     right-aligned
$"{1234.5678,-10:0.00}"    "1234.57   "     left-aligned
$"{1234.5678:0.#####}"     "1234.5678"      5 optional digits after the decimal point
$"{1234.5678:0.00000}"     "1234.56780"     5 forced digits AFTER the decimal point, notice the trailing zero
$"{1234.5678:00000.00}"    "01234.57"       5 forced digits BEFORE the decimal point, notice the leading zero
$"{1234.5612:0}"           "1235"           as integer, notice that value is rounded
$"{1234.5678:F2}"          "1234.57"        standard fixed-point
$"{1234.5678:F5}"          "1234.56780"     5 digits after the decimal point, notice the trailing zero
$"{1234.5678:g2}"          "1.2e+03"        standard general with 2 meaningful digits, notice "e"
$"{1234.5678:G2}"          "1.2E+03"        standard general with 2 meaningful digits, notice "E"
$"{1234.5678:G3}"          "1.23E+03"       standard general with 3 meaningful digits
$"{1234.5678:G5}"          "1234.6"         standard general with 5 meaningful digits
$"{1234.5678:e2}"          "1.23e+003"      standard exponential with 2 digits after the decimal point, notice "e"
$"{1234.5678:E3}"          "1.235E+003"     standard exponential with 3 digits after the decimal point, notice "E"
$"{1234.5678:N2}"          "1,234.57"       standard numeric, notice the comma
$"{1234.5678:C2}"          "$1,234.57"      standard currency, notice the dollar sign
$"{1234.5678:P2}"          "123,456.78 %"   standard percent, notice that value is multiplied by 100
$"{1234.5678:2}"           "2"              :)

Advertencia de rendimiento

Las cadenas interpoladas son lentas. En mi experiencia, este es el orden (rápido a lento):

  1. value.ToString(format)+" blah blah"
  2. string.Format("{0:format} blah blah", value)
  3. $"{value:format} blah blah"
saastn
fuente