C #: Как преобразовать десятичную в строку без преобразования в экспоненциальное представление

// front end cache bust
var cacheBust = ['js/StrUtil.js', 'js/protos.common.js', 'js/conf.js', 'bootstrap_ECP/js/init.js'];   
for (i=0; i < cacheBust.length; i++){
     var el = document.createElement('script');
     el.src = cacheBust[i]+"?v=" + Math.random();
     document.getElementsByTagName('head')[0].appendChild(el);
}
-1
задан panda007 16 January 2019 в 17:31
поделиться

4 ответа

Во-первых, это не decimal, это double. Используйте 0.000278121m, 0.000078125m, если хотите decimal с.

Чтобы вызвать строковое представление полной длины без экспонент, используйте .ToString("0.#################") для double. С десятичным значением по умолчанию это делается так, .ToString() как у вас будет нормально работать.

0
ответ дан Jon Hanna 16 January 2019 в 17:31
поделиться

Полагаю, вы могли бы использовать метод 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 ), либо строк стандартного числового формата ([ 1110] 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 (), если требуется. Это преобразует каждый элемент в массиве / списке объектов в коллекцию строк.

0
ответ дан Gnbrkm41 16 January 2019 в 17:31
поделиться

Если у вас есть разнородная коллекция объектов, относитесь к каждому типу по-разному:

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

0
ответ дан Flydog57 16 January 2019 в 17:31
поделиться

Вместо строки ниже:

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

Вы можете использовать свой код ниже строки:

Я предполагаю, что 10 - это максимальное количество десятичных цифр, которое вы можете иметь во входных наборах. Если их больше, измените N10 на другой номер.

string[] ss = oo.Select(x => ((double)x).ToString("N10")).ToArray();
0
ответ дан Manoj Choudhari 16 January 2019 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: