десятичное форматирование без округления .net - PullRequest
1 голос
/ 16 июля 2009

Вчера я задал этот общий вопрос о десятичных дробях и их внутренней точности. Вот конкретный вопрос о сценарии, на который я пытаюсь ответить.

У меня есть столбец в SqlServer, который напечатан - десятичный (18,6). Когда я получаю эти значения, созданные десятичные числа .net соответствуют точности в базе данных. Они выглядят так:

1.100000
0.960000
0.939000
0.844400
0.912340

Мне нужно представить (ToString) эти значения в соответствии с этими правилами:

  • Нулевые значения всегда отображаются.
  • Отображаются завершающие нули на или перед n-м десятичным знаком.
  • Конечные нули после n-го десятичного разряда не отображаются.

Итак, это то, что я хочу, когда n равно 3:

1.100
0.960
0.939
0.8444
0.91234

Теперь я написал некоторый код, который ToString является десятичным: удаляет все конечные нули, а затем анализирует строку в поисках десятичной точки и подсчитывает количество десятичных разрядов, чтобы увидеть, сколько конечных нулей необходимо добавить обратно. Есть ли лучший способ сделать это?

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

Ответы [ 3 ]

9 голосов
/ 16 июля 2009

Чтобы вывести необходимый формат с n = 3, вы можете использовать:

number.ToString("0.000###")

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

string format = "0." + new string('0', n) + new string('#', 6 - n);
s = number.ToString(format);
3 голосов
/ 16 июля 2009

Вы должны быть в состоянии сделать это, отформатировав значение следующим образом:

var str = num.ToString("#0.000#####");

Число 0 s определяет минимальное количество цифр, а число 0 s плюс # s - максимальное количество цифр. Я не уверен, что вы действительно хотите максимум, но я верю, что это самое близкое, что вы получите. Конечно, вы можете просто установить его на произвольное (большое) число.

0 голосов
/ 16 июля 2009

Ничего из того, что вы могли бы сделать с самим десятичным числом, будет недостаточно по крайней мере по следующей причине: вы не можете сохранить в самом десятичном числе то, что вы хотите, чтобы x начальных / конечных нулей были напечатаны при преобразовании значения в строка. Десятичный тип данных в .NET - это просто тип значения, состоящий из 128 бит, и все они предназначены для представления числа. Никакая информация о форматировании, когда число печатается, не включена, и тот факт, что это тип значения, позволяет быстро передавать его в качестве аргумента в стеке, что также облегчает сборщик мусора.
Вы можете переносить десятичную дробь в некоторый класс, сгенерируйте экземпляры этого класса в вашем DAL и верните коллекцию тех, если вам нужно сделать какое-то сокращение числа позже в приложении, и если это не так, вы можете просто применить «stringification» в вашем DAL и вернуть коллекция строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...