2012-07-27 41 views
8

He estado buscando esto pero parece que no puedo encontrar la respuesta. Tengo las siguientes decimales con la salida correspondiente que yo quiero de String.FormatFormato decimal C# - Mantener el último cero

100.00 -> 100
100.50 -> 100.50
100.51 -> 100.51

Mi problema es que me parece que no puede encontrar una formato que mantendrá el 0 en el extremo de 100.50, así como eliminar los 2 ceros de 100.

Cualquier ayuda es muy apreciada.

EDIT Para mayor claridad. Tengo variables de tipo decimal, solo van a tener 2 decimales. Básicamente quiero mostrar 2 decimales si existen o ninguno, que no quieren mostrar una cifra decimal en el caso de convertirse 100.50 100.5

+0

You Want "100.50" para convertirse en "1,50"? –

+2

Ejemplo por favor! –

Respuesta

14

Se puede utilizar esta:

string s = number.ToString("0.00"); 
if (s.EndsWith("00")) 
{ 
    s = number.ToString("0"); 
} 
+2

Al igual que con la respuesta de tobias86, esto no funciona en todas las máquinas, ya que algunos usan una coma para el separador decimal. –

+0

+1, nice one ... – Heinzi

+0

Gracias Mark. Lo siento debería haber sido más claro sobre la cultura, puedo ignorarlo en este caso. Esto funciona perfectamente – Peuge

16

Por lo Lo sé, no hay tal formato. Usted tendrá que aplicar de forma manual, por ejemplo .:

String formatString = Math.Round(myNumber) == myNumber ? 
         "0" :  // no decimal places 
         "0.00"; // two decimal places 
+2

'100.001' usaría el formato '" 0.00 "'. –

+1

@MarkusJarderot: De hecho. Solo el OP puede responder si este es el comportamiento deseado o no. Él no incluye un ejemplo con más dígitos. – Heinzi

+0

La mejor solución hasta el momento. Gracias por este –

2

Ok, esto perjudica a los ojos, pero debe darle lo que quiere:

string output = string.Format("{0:N2}", amount).Replace(".00", ""); 

ACTUALIZACIÓN: me gusta la respuesta de Heinzi más.

+1

Esto no funciona en mi máquina, donde una coma es la predeterminada para el decimal. :) –

+0

@ AndersHolmström Cierto ... No pensé en la localización. – tobias86

+5

Nadie lo hace ... (Trabajo en una empresa de traducción :)) –

5

prueba si su número es un entero, y el uso de formato de acuerdo:

string.Format((number % 1) == 0 ? "{0}": "{0:0.00}", number) 
1

Este enfoque permitirá alcanzar el resultado deseado mientras se aplica la referencia cultural especificada:

decimal a = 100.05m; 
decimal b = 100.50m; 
decimal c = 100.00m; 

CultureInfo ci = CultureInfo.GetCultureInfo("de-DE"); 

string sa = String.Format(new CustomFormatter(ci), "{0}", a); // Will output 100,05 
string sb = String.Format(new CustomFormatter(ci), "{0}", b); // Will output 100,50 
string sc = String.Format(new CustomFormatter(ci), "{0}", c); // Will output 100 

Puede reemplazar el cultivo con CultureInfo.CurrentCulture o cualquier otra cultura para satisfacer sus necesidades.

La clase CustomFormatter es:

public class CustomFormatter : IFormatProvider, ICustomFormatter 
{ 
    public CultureInfo Culture { get; private set; } 

    public CustomFormatter() 
     : this(CultureInfo.CurrentCulture) 
    { } 

    public CustomFormatter(CultureInfo culture)    
    { 
     this.Culture = culture; 
    } 

    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 

     return null; 
    } 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     if (formatProvider.GetType() == this.GetType()) 
     { 
      return string.Format(this.Culture, "{0:0.00}", arg).Replace(this.Culture.NumberFormat.NumberDecimalSeparator + "00", ""); 
     } 
     else 
     { 
      if (arg is IFormattable) 
       return ((IFormattable)arg).ToString(format, this.Culture); 
      else if (arg != null) 
       return arg.ToString(); 
      else 
       return String.Empty; 
     } 
    } 
}