例如,我有一个带有某些值的对象数组。它可以是十进制,双精度,int或字符串。
object[] oo = {0.000278121, 0.000078125m, "Hello",1};
例如,当将此值转换为字符串时,第二个值变为7.8125E-05。但是第一个值保持不变。那么,如何区分该类型的解析逻辑,并以相同格式解析所有十进制值?完整代码:
object[] oo = {0.000278121, 0.000078125,"Hello",1};
string[] ss = oo.Select(x => x.ToString()).ToArray();
Console.WriteLine(string.Join("|",ss)); // 0.000278121|7.8125E-05
答案 0 :(得分:2)
首先,它不是decimal
,而是double
。如果需要0.000278121m, 0.000078125m
,请使用decimal
。
要强制使用不含指数的全长字符串表示形式,请使用.ToString("0.#################")
来表示两倍。使用十进制时,默认值可以做到这一点,因此.ToString()
可以正常工作。
答案 1 :(得分:0)
代替下面的行:
string[] ss = oo.Select(x => x.ToString()).ToArray();
您可以在下面的代码行中使用
:我假设10是输入集中可以包含的最大十进制数字。 如果还有更多,则将N10更改为其他数字。
string[] ss = oo.Select(x => ((double)x).ToString("N10")).ToArray();
答案 2 :(得分:0)
如果您有不同的对象集合,请分别对待每种类型:
var outStrings = new List<string>();
object[] oo = { 0.000278121, 0.000078125, "Hello World" };
foreach (var ooItem in oo) {
if (ooItem is double dOo) {
outStrings.Add(dOo.ToString("0.#################"));
} else {
outStrings.Add(ooItem.ToString());
}
}
如果要单独处理许多类型,请使用模式匹配switch
语句
答案 3 :(得分:0)
我相信您可以使用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
的类型不适合您的情况。但是,总体思路是相同的。将对象强制转换为double,以适当的精度使用ToString(string)方法,然后修剪尾随的零。
您可以通过执行obj is double
来检查对象的类型是否为double,然后通过obj is double dbl
将其转换回double(模式匹配)。
编辑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()。这会将对象数组/列表中的每个项目转换为字符串的集合。