Edit:
Там есть обходной путь с помощью встроенного в ToString()
(с помощью цифр заполнитель #
) иReplace
и/илиTrim
:
double n1 = 1234;
double n2 = 1234.5;
double n3 = 1234567.89;
double n4 = 1234.567;
string s1 = n1.ToString("### ### ###.###").Replace(".",",").Trim();
string s2 = n2.ToString("### ### ###.###").Replace(".", ",").Trim();
string s3 = n3.ToString("### ### ###.###").Replace(".", ",").Trim();
string s4 = n4.ToString("### ### ###.###").Replace(".", ",").Trim();
Комбинат ИНГ его числовом формате для чтения ,
в качестве десятичного разделителя не работы, хотя:
double n1 = 1234;
double n2 = 1234.5;
double n3 = 1234567.89;
double n4 = 1234.567;
var nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
nfi.NumberGroupSeparator = " ";
string s1 = n1.ToString("### ### ###,###", nfi); //doesn't work
string s2 = n2.ToString("### ### ###,###", nfi);
string s3 = n3.ToString("### ### ###,###", nfi);
string s4 = n4.ToString("### ### ###,###", nfi);
Оригинал:
Я думаю, вы не можете использовать только встроенный ToString()
, чтобы получить его правильно. Вы, вероятно, потребуются некоторые LINQ
уловки, чтобы получить результат, который вы хотите:
double n1 = 1234;
double n2 = 1234.5;
double n3 = 1234567.89;
double n4 = 1234.567;
var nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
nfi.NumberGroupSeparator = " ";
string s1 = new string(n1.ToString("N", nfi).Reverse().SkipWhile(x => x == '0' || x == ',').Reverse().ToArray());
string s2 = new string(n2.ToString("N", nfi).Reverse().SkipWhile(x => x == '0' || x == ',').Reverse().ToArray());
string s3 = new string(n3.ToString("N", nfi).Reverse().SkipWhile(x => x == '0' || x == ',').Reverse().ToArray());
string s4 = new string(n4.ToString("N", nfi).Reverse().SkipWhile(x => x == '0' || x == ',').Reverse().ToArray());
Там причина из-за двух вещей следующим образом:
Первый, double
является не точным. Когда вы вводите что-то вроде double n = 1234.5
, фактическое double
значение, хранящееся может быть что-то вроде n = 1234.499999999999998
Во-вторых, речь идет о ToString()
. Он действительно используется только для форматирования. Другими словами, зависит от того, как вы его диктуете, это покажет что-то. Например, если вы даете инструкцию, чтобы показать номер с 2 значащими цифрами после десятичного разделителя, тогда он будет показывать число с ровно 2 значащими цифрами после десятичного разделителя.
Теперь, положив две вещи вместе мы получили дилемму здесь! То, что вы хотите, чтобы программа сделала, это: «Покажите мне столько же значительных цифр, сколько и должно быть». Однако, когда вы введете double n = 1234.5
, программа покажет 1234.499999999999998
! Но, с другой стороны, вы также не хотите фиксировать число после десятичного разделителя.
Итак, я думаю, вы должны использовать LINQ SkipWhile
и Reverse
, чтобы сделать это, а не простым встроенным.
Вы пробовали мое решение, используя 'Replace' и' Trim' или 'LINQ'? Все они встроены, если вы ищете встроенные решения ... – Ian
Ваше решение не удастся при многих обстоятельствах, поскольку вы предоставляете «### ### ###. ###» в качестве параметра и этой строки зависит от значения double и количества цифр десятичной запятой, которое оно имеет. Оно также зависит от разделителя десятичных чисел и разделителя групп в объекте NumberFormatInfo. Например, ваше решение завершится неудачно с двойным значением 0.1234, когда оно округляет его до три знака после запятой. Создание пользовательской версии этой строки для каждого номера и объекта NumberFormatInfo является склонным к ошибкам и нецелесообразным. Мое решение всегда работает с любым двойным и любым объектом NumberFormatInfo – tjsmith
, который я вижу ... тогда вы можете также использовать LINK , так как он является встроенным. Решение LINQ должно иметь возможность обрабатывать другие упоминаемые вами решения. – Ian