Полагаю, вы могли бы использовать метод double.ToString (string). Увидеть:
https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring?view=netframework-4.7.2#System_Double_ToString_System_String_
Параметр может представлять собой либо строки произвольного числового формата (https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings), либо строки стандартного числового формата (https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings?view=netframework-4.7.2#NFormatString).
)
Спецификатор точности спецификатора формата «N» должен быть в диапазоне от 0 до 99 (N0 ~ N99), в противном случае метод ToString вернет строку, переданную в качестве параметра. Вы можете сделать double.ToString("N99")
, который вернет строку в числовой форме с самой высокой точностью. Проблема в том, что если вы сделаете 0.000078125.ToString("N99")
, то на выходе будет много конечных 0, например: 0.0000781250000000000...
.
Чтобы преодолеть это, вы можете использовать метод string.TrimEnd (char). 0.000078125.ToString ("N99"). TrimEnd ('0') обрежет конечные нули, поэтому на выходе может быть 0,000078125.
В данном примере кода это может быть применено как:
//Avoid boxing - specify types whenever possible, or use generic
double[] oo = {0.000278121, 0.000078125};
string[] ss = oo.Select(x => x.ToString("N99").TrimEnd('0')).ToArray();
Console.WriteLine(string.Join("|",ss)); // 0.000278121|0.000078125
Изменить: Я должен был прочитать вопрос более внимательно, изменение типа oo
не подойдет в вашем случае. Однако общая идея та же самая; Приведите объект к удвоению, используйте метод ToString (string) с соответствующей точностью, затем обрежьте конечные нули.
Вы можете проверить, что тип объекта является двойным, выполнив obj is double
, и, кроме того, приведите его обратно к удвоению на obj is double dbl
(сопоставление с образцом).
Редактировать 2:
public static IEnumerable<string> AllToString(IEnumerable<object> objArray)
{
foreach (object obj in objArray)
{
switch (obj)
{
case double dbl:
yield return dbl.ToString("N99").TrimEnd('0');
break;
case bool b:
yield return b.ToString();
break;
case int i:
yield return i.ToString();
break;
case short s:
yield return s.ToString();
break;
case string str:
yield return str;
break;
case float flt:
yield return flt.ToString("N99").TrimEnd('0');
break;
case decimal dcm:
yield return dcm.ToString("N99").TrimEnd('0');
break;
case byte bt:
yield return bt.ToString();
break;
case char ch:
yield return ch.ToString();
break;
case uint ui:
yield return ui.ToString();
break;
case ushort us:
yield return us.ToString();
break;
case sbyte sb:
yield return sb.ToString();
break;
case long ln:
yield return ln.ToString();
break;
case ulong uln:
yield return uln.ToString();
break;
case null:
yield return null; //new string()?
break;
case DateTime dt:
yield return dt.ToString();
break;
case TimeSpan ts:
yield return ts.ToString();
break;
default: //Fallback
yield return obj.ToString();
break;
}
}
}
Передайте массив объектов методу, затем вызовите .ToArray () или .ToList (), если требуется. Это преобразует каждый элемент в массиве / списке объектов в коллекцию строк.