2010-01-18 16 views
9

Tengo el valor decimal 18.8. Los valores que se almacenan en esta variable pueden ser de cualquier tipo. Por ejemplo, puede ser 1.0000000 o 1.00004000 o 5.00000008. Me gustaría escribir un método para que pueda pasarle decimal y obtener una cadena redondeada. Esto no sería un problema si quisiera saber los lugares decimales que me gustaría obtener. Pero lo que me gustaría obtener es:Cómo acercarse mejor a los decimales de redondeo en C#

Cuando es 1.0000000 debería devolver 1.
Si es 1.00004000 debería devolver 1.00004.
Cuando es 5.00000008 debe devolver 5.00000008. Así que, básicamente, debería encontrar todos los 0 que están detrás del último dígito diferente de 0 y cortarlo.

¿Cómo debo abordarlo? ¿Cuál es el mejor método? Obtengo este valor de SQL y lo pongo en una variable decimal, pero luego me gustaría mostrarlo y tener 5.0000000 cuando podría mostrarse como 5 es un poco exagerado para mí.

Espero que pueda obtener algunas sugerencias agradables.

En lo que respecta,

MadBoy

Respuesta

9

yo sepa, ToString ("0. ##") va a hacer, simplemente aumentar el número de # para que su valor no redondear hacia arriba. Por ejemplo:

decimal d = 1.999m; 
string dStr = d.ToString("0.###"); 

Esto generará una secuencia de "1,999" (el delimitador depende de la cultura utilizada).

Como resultado, puede usar una cadena de formato común muy larga: "0.############################" - para formatear todos sus valores.

+0

No sé la cantidad de lugares decimales que necesito. Esto funcionaría si supiera que quiero cortarlo después de 3 dígitos o más. Pero quiero cortarlo solo si todos los dígitos son ceros después del último cero. – MadBoy

+1

Si tiene 1.00004000, luego de ToString ("0. ####################") tendrá "1.00004". Hablando de MAX de # signos: es 28. Decimal permite un máximo de 28-29 dígitos significativos. Esto hace 1 para el cero inicial y 28 para otros signos. Incluso si tiene algo como 15555.98900008900, estará bien. – terR0Q

+0

Gracias, funciona. Debería haberlo probado antes de dudar de que funcionará como dijiste que sería. – MadBoy

2

Recorte los ceros desde el final.

decimal d = 1.999m; 
string dStr = d.ToString().TrimEnd('0').TrimEnd('.'); 
+0

Y si hay un valor de 1,000,000.00? Entonces él pierde todo cero, supongo. O queda "1,000,000". – Webleeuw

+1

Pierde solo los ceros después del punto (.) Permanece el punto, pero podría simplemente agregar otro 'TrimEnd ('.')'. Para I18N, no debería usar el punto, sino el separador específico de cultivo. – Scoregraphic

1

También puede utilizar string.Format y here's la documentación de los diferentes formatos posibles, pero me gusta Johan Sheehan cheat sheet más como una referencia rápida.

decimal number=4711.00004711m; 
4711.00004711 
string.Format("{0:0.#############}",number); 
"4711,00004711" 
number=42; 
42 
string.Format("{0:0.#############}",number); 
"42"