2010-10-03 4 views
2

скажем, у меня есть список знаков после запятой:два способа отображения десятичной

List<decimal> values; 

и 2 функции для отображения десятичного:

string DisplayPct(decimal pct) 
{ 
    return pct.ToString("0.00 %"); 
} 

string DisplayValue(decimal val) 
{ 
    return val.ToString("0.00"); 
} 

Что бы быть лучшим механизмом реализации, так что я может знать, какую функцию вызывать в зависимости от значения?

Мне бы хотелось иметь, например, typedefs в C#. Таким образом, я мог бы объявить тип Percent и тип Decimal, которые оба будут представлять десятичные значения, но тогда я мог бы знать, как отображать значение, основанное на его типе.

Любой эквивалент в C#?

Благодаря

+1

Просто для информации: В зависимости от местности разделитель может быть запятой вместо точки. – some

ответ

2

Оберните проценты в классе. Немного работы с вашей стороны. Просто не забудьте определить implicit operator, чтобы фиксировать десятичные знаки, а также некоторые другие операции и ToString по мере необходимости.

+0

Спасибо за неявный операторский намек, я нашел, как это сделать. Не стесняйтесь комментировать, если его можно улучшить. – ibiza

2

Это звучит, как вы хотите два класса: а десятичные и процентов. Каждый из них будет иметь ToString, который печатает соответствующим образом. Если они оба имеют один и тот же интерфейс, вы можете иметь коллекцию обоих в списке, используя этот общий интерфейс.

+0

Итак, я создаю класс наследования десятичного числа.? – ibiza

+0

Не совсем. Ваш список должен иметь тип 'value', где значение - общий интерфейс. Затем создайте два класса, каждый из которых наследует от 'value': decimal и percent. – JoshD

+0

Как бы этот интерфейс был определен более точно, пожалуйста? – ibiza

3

Вот мои классы:

public class Percent 
    { 
     public decimal value; 
     public Percent(decimal d) { value = d; } 
     public static implicit operator Percent(decimal d) { return new Percent(d); } 
     public static implicit operator decimal(Percent p) { return p.value; } 
    } 
    public class DecimalPrecise 
    { 
     public decimal value; 
     public DecimalPrecise(decimal d) { value = d; } 
     public static implicit operator DecimalPrecise(decimal d) { return new DecimalPrecise(d); } 
     public static implicit operator decimal(DecimalPrecise d) { return d.value; } 
    } 
+0

Просто переопределите ToString(), и вам хорошо идти. Я забыл, что это десятичные знаки не должны быть обернуты в структуры, я отредактирую свой ответ. – Jonn

Смежные вопросы