2010-01-18 2 views
9

У меня десятичное значение 18.8. Значения, которые хранятся в этой переменной, могут быть любого типа. Например, это может быть 1.0000000 или 1.00004000 или 5.00000008. Я хотел бы написать метод, чтобы я мог перейти к нему десятичным числом и округлить строку. Это не было бы проблемой, если бы я знал десятичные места, которые хотел бы получить. Но я бы хотел получить:Как лучше всего аппроксимировать округление десятичных знаков в C#

Когда это 1.0000000, он должен вернуть 1.
Если это 1.00004000, он должен вернуть 1.00004.
Когда это 5.00000008, он должен вернуться 5.00000008. Таким образом, в основном он должен найти все 0, которые находятся за последней цифрой, отличной от 0, и отключить ее.

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

Надеюсь, что у меня появятся хорошие предложения.

С уважением,

MadBoy

ответ

9

AFAIK, ToString ("0. ##") будет делать, просто увеличить число # так, что ваше значение не будет сгонять. Например:

decimal d = 1.999m; 
string dStr = d.ToString("0.###"); 

Это будет генерировать строку «1,999» (разделитель зависит от используемой культуры).

В результате вы можете использовать обычную очень длинную строку форматирования: "0.############################" - для форматирования всех ваших значений.

+0

Я не знаю, количество десятичных знаков мне нужно. Это сработает, если я узнаю, что хочу отключить его после 3-х цифр и более. Но я хочу отключить его, только если все цифры являются нулями после последнего, отличного от нуля. – MadBoy

+1

Если у вас есть 1.00004000, то после ToString («0. ####################») у вас будет «1.00004». Говоря о MAX из # знаков: оно равно 28. Десятичное значение допускает максимум 28-29 значащих цифр. Это делает 1 для ведущих ноль и 28 для других знаков. Даже если у вас есть что-то вроде 15555.98900008900, все будет в порядке. – terR0Q

+0

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

2

Так что обрезать нули с конца.

decimal d = 1.999m; 
string dStr = d.ToString().TrimEnd('0').TrimEnd('.'); 
+0

И если есть значение 1,000,000.00? Тогда он потеряет все ноль, я полагаю? Или остается «1 000 000». – Webleeuw

+1

Он теряет только нули после точки (.) Остается точка, но он может просто добавить еще один 'TrimEnd ('.')'. Для I18N он не должен использовать точку, а специфический для культуры разделитель. – Scoregraphic

1

Вы также можете использовать string.Format и here's в документации различных возможных форматов, но мне нравится Йохан Sheehans более cheat sheet в качестве быстрой ссылки.

decimal number=4711.00004711m; 
4711.00004711 
string.Format("{0:0.#############}",number); 
"4711,00004711" 
number=42; 
42 
string.Format("{0:0.#############}",number); 
"42" 
Смежные вопросы