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

时间:2019-01-16 17:13:23

标签: c# object decimal

例如,我有一个带有某些值的对象数组。它可以是十进制,双精度,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

4 个答案:

答案 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()。这会将对象数组/列表中的每个项目转换为字符串的集合。