Как мне проверить, является ли десятичное значение .NET целым числом? - PullRequest
4 голосов
/ 20 августа 2010

У меня есть класс, представляющий единицу измерения с Decimal в качестве числа. Просто для упрощения этого примера, скажем, я представляю сантиметры. Я хотел бы реализовать метод ToString () для этого класса. Дело в том, что если числовое значение представляет собой целое число, я хотел бы просто отобразить десятичное число в виде целого числа. В противном случае, я хотел бы сохранить это как десятичную. Так, например, 10,5D сантиметров будут отображаться как «10,5 см», а 7,0D сантиметров должны отображаться как «7 см». Я хотел бы, чтобы это было быстро и просто читать. У меня есть рабочее решение, но, похоже, должен быть лучший способ.

Вот надуманный пример, показывающий мою первую трещину:

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

Мне немного неудобно с Me.NumericValue = Decimal.Ceiling(Me.NumericValue). Есть мысли о том, как сделать это лучше? Есть ли что-то, что я мог бы сделать с String.Format или каким-либо другим методом в классе Decimal, который мог бы сделать это более понятным и сохранить его производительность?

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Вы можете попробовать:

decimal.Truncate(myDecimal) == myDecimal

Это может быть достаточно для ваших целей. Однако это сложный вопрос; простое использование System.Decimal не избавляет от всех проблем, связанных с представлениями с плавающей точкой. Пример кода здесь является тому примером.

0 голосов
/ 20 августа 2010

Вы уверены, что хотите это сделать?

Любой, у кого фоновый рисунок, будет читать «7 см» как «приблизительно семь сантиметров» и «7.00 см» как «семь сантиметров до ближайшего миллиметра».

0 голосов
/ 20 августа 2010

Вот еще один способ

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...