2010-08-20 6 views
4

J'ai classe représentant une unité de mesure avec un Decimal comme numérique. Simplement pour simplifier les choses, disons que je représente des centimètres. Je voudrais implémenter une méthode ToString() pour cette classe. La chose est, si la valeur numérique est un nombre entier, je voudrais juste afficher la décimale comme un nombre entier. Sinon, j'aimerais le garder en décimal. Ainsi, par exemple, 10,5D centimètres s'afficheront comme "10,5 cm", mais les centimètres 7,0D devraient afficher comme "7cm". J'aimerais que ce soit rapide et simple à lire. J'ai une solution de travail, mais il semble qu'il devrait y avoir un meilleur moyen.Comment vérifier si une valeur décimale .NET est un nombre entier?

Voici un exemple montrant artificiel ma première fissure à elle:

Public Property Units As String = "cm" 
Public Property NumericValue As Decimal = 10.5D 

Public Overrides Function ToString() 
    Dim num As String = If(Me.NumericValue = Decimal.Ceiling(Me.NumericValue), _ 
          Decimal.ToInt32(Me.NumericValue).ToString(), _ 
          Me.NumericValue.ToString()) 
    Return num + Me.Units 
End Function 

Je suis un peu mal à l'aise avec Me.NumericValue = Decimal.Ceiling(Me.NumericValue). Des idées sur comment faire mieux? Y at-il quelque chose que je pourrais faire avec String.Format ou une autre méthode sur la classe Decimal qui rendrait cela plus clair et le garderait performant?

Répondre

3

Vous pouvez essayer:

decimal.Truncate(myDecimal) == myDecimal 

Cela pourrait être assez bon pour vos besoins. Cependant, c'est une question complexe; simplement en utilisant System.Decimal ne se débarrasse pas de tous les problèmes liés aux représentations à virgule flottante. L'exemple de code here est un exemple typique.

0

Voici une autre façon

Public Overrides Function ToString() 
     If (Me.NumericValue - Math.Round(Me.NumericValue, 0) > 0) Then 
       Return String.Format("{0:###,###,##0.00}{1}", Me.NumericValue, Units); 
     Return String.Format("{0:###,###,##0}{1}", Me.NumericValue, Units) 
    End Function 
0

Êtes-vous sûr de vouloir le faire? Quiconque ayant un arrière-plan qui engendre lit «7 cm» comme «environ sept centimètres» et «7,00 cm» comme «sept centimètres au millimètre près».

+0

C'est un exemple artificiel. Je suis en train d'analyser CSS à partir d'un document XHTML et d'écrire une classe qui représente les valeurs numériques avec des unités comme px, em, cm, in,%, etc. Donc oui, je veux 7cm, pas 7.0cm. – mattmc3