为了账号安全,请及时绑定邮箱和手机立即绑定

C#:如何将十进制转换为字符串而不转换为指数表示

C#:如何将十进制转换为字符串而不转换为指数表示

C#
暮色呼如 2022-07-23 17:58:31
例如,我有一个包含一些值的对象数组。它可以是十进制、双精度、整数或字符串。 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
查看完整描述

4 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

首先,这不是一个decimal,而是一个double0.000278121m, 0.000078125m如果你想要decimals,请使用。

要强制使用没有指数的全长字符串表示形式,请使用.ToString("0.#################")double。使用小数,默认情况下会这样做,.ToString()因为您可以正常工作。


查看完整回答
反对 回复 2022-07-23
?
三国纷争

TA贡献1804条经验 获得超7个赞

如果您有不同的对象集合,请区别对待每种类型:


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语句


查看完整回答
反对 回复 2022-07-23
?
森栏

TA贡献1810条经验 获得超5个赞

我相信你可以使用 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()。这会将对象数组/列表中的每个项目转换为字符串集合。


查看完整回答
反对 回复 2022-07-23
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

而不是下面的行:

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

您可以使用下面的代码行:

我假设 10 是您在输入集中可以拥有的最大十进制位数。如果有更多,则将 N10 更改为其他数字。

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


查看完整回答
反对 回复 2022-07-23
  • 4 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信