C#:如何在不转换为指数表示的情况下将十进制转换为字符串

C#:如何在不转换为指数表示的情况下将十进制转换为字符串,c#,object,decimal,C#,Object,Decimal,例如,我有一个带有一些值的对象数组。它可以是十进制、双精度、整数或字符串。 object[]oo={0.000278121,0.000078125米,“你好”,1} 例如,将此值转换为字符串时,第二个值变为7.8125E-05。但第一个值保持在数组中。那么,如何区分这些类型的解析逻辑,并以相同的格式解析所有十进制值呢?完整代码: object[] oo = {0.000278121, 0.000078125,"Hello",1}; string[] ss = oo.Select(x =>

例如,我有一个带有一些值的对象数组。它可以是十进制、双精度、整数或字符串。
object[]oo={0.000278121,0.000078125米,“你好”,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

首先,这不是十进制的,而是双精度的。如果需要
decimal
s,请使用
0.000278121m、0.0000781125m

若要强制使用不带指数的全长字符串表示,请使用
.ToString(“0.####################”)
表示双精度。对于decimal,默认值是这样做的。
.ToString()
,就像您所做的那样可以很好地工作。

而不是下面的行:

string[] ss = oo.Select(x => x.ToString()).ToArray();
您可以使用下面的代码行:

我假设10是输入集中的最大小数位数。 如果有更多,则将N10更改为其他数字

string[] ss = oo.Select(x => ((double)x).ToString("N10")).ToArray();

如果有不同的对象集合,请以不同的方式对待每种类型:

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());
    }
}
var outStrings=new List();
对象[]oo={0.000278121,0.000078125,“你好,世界”};
foreach(oo中的oovar-ooItem){
如果(OO项为双dOo){
突出部分。添加(dOo.ToString(“0.#######################”);
}否则{
Add(ooItem.ToString());
}
}

如果有许多类型需要单独处理,请使用模式匹配
开关
语句我相信可以使用double.ToString(字符串)方法。见:

参数可以是自定义数字格式字符串()或标准数字格式字符串()

“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

在给定的示例代码中,这可以应用为:

//避免装箱-尽可能指定类型,或使用泛型
双[]oo={0.000278121,0.000078125};
字符串[]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
,可以检查对象的类型是否为double,此外,还可以通过
obj is double dbl
(模式匹配)将其转换回double

编辑2:

公共静态IEnumerable AllToString(IEnumerable objArray)
{
foreach(对象数组中的对象obj)
{
开关(obj)
{
案例双dbl:
收益率返回dbl.ToString(“N99”).TrimEnd(“0”);
打破
案例b:
收益率返回b.ToString();
打破
案例一:
收益率收益率i.ToString();
打破
简写为:
收益率收益率s.ToString();
打破
大小写字符串str:
收益率;
打破
浮箱flt:
收益率回报flt.ToString(“N99”).TrimEnd(“0”);
打破
大小写十进制dcm:
收益率回报dcm.ToString(“N99”).TrimEnd(“0”);
打破
大小写字节bt:
收益率返回bt.ToString();
打破
case char ch:
收益率返回ch.ToString();
打破
案例uint用户界面:
收益率返回ui.ToString();
打破
美国案例:
收益率返回us.ToString();
打破
案例sbyte sb:
让某人返回字符串();
打破
案例长度ln:
收益率返回项次ToString();
打破
乌隆乌尔恩案:
收益率返回uln.ToString();
打破
大小写为空:
yield返回null;//新字符串()?
打破
案例日期时间:
收益率返回dt.ToString();
打破
案例时间跨度ts:
收益率返回ts.ToString();
打破
默认值://回退
收益率返回对象ToString();
打破
}
}
}

将对象数组传递给该方法,然后根据需要调用.ToArray()或.ToList()。这将把数组/对象列表中的每一项转换为字符串集合。

您可以指定要作为参数的格式。通过使用
object[]
而不是
double[]
您不允许您的代码使用
double.ToString()
,只允许有限的
object.ToString()
method@PanagiotisKanavos但ToString()没有可用的参数。我还从Excel文件中读取了这个对象数组,并不是所有的值都是十进制的。因此,还需要检查它是否可以转换为十进制?另一个选项是使用
String.Format(“{0:…”,x)
而不是
ToString()
是否可以将对象中的小数转换为第一个双精度?对象[]oo={(double)0.000278121,(double)0.000078125};这些是