-1
votes

C #: Comment convertir décimal en chaîne sans convertir en représentation exponentielle

Par exemple, j'ai une matrice d'objet avec certaines valeurs. Il peut être décimal, double, int ou cordes. objet [] OO = {0.000278121, 0.000078125M, "Bonjour", 1}; code> Par exemple, lors de la conversion de ces valeurs en chaîne, la deuxième valeur devient 7.8125E-05. Mais la première valeur reste comme dans le tableau. Donc, comment différencier la logique d'analyse de ce type et analyser toutes les valeurs décimales dans le même format? Code complet:

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


13 commentaires

Vous pouvez spécifier le format que vous souhaitez comme paramètre sur double.Tostring () . En utilisant objet [] au lieu de double [] Vous n'autorise pas votre code à utiliser double.tostring () mais seulement le < code> objet.tostring () méthode


@Panagiotikanavos mais il n'y a pas de paramètre disponible pour Tostring (). Et aussi, j'ai lu ce tableau d'objet à partir du fichier Excel et toutes les valeurs ne sont pas décimales. Donc, il est également nécessaire de vérifier s'il est convertible en décimal?


Une autre option consiste à utiliser string.format ("{0: ...", x) au lieu de tostring ()


Pourriez-vous lancer les décimales de l'objet pour doubler d'abord? objet [] OO = {(double) 0.000278121, (double) 0.000078125};


Ce ne sont pas décimal , par voie, ils sont double . Si vous voulez des décimales, vous devez suffixer le numéro avec un "M": objet [] OO = {0.000278121M, 0.000078125M}; toute raison particulière que vous les mettez dans un éventail d'objet ( autre qu'une représentation de type valeur)?


Exceller? C'est un autre cas alors. Si vous utilisez une bibliothèque comme EPPLUS ou OPENXML SDK, vous pouvez récupérer des valeurs de cellules comme texte fortement dactylographié, doubles, etc.


La raison pour laquelle Tostring ne prend pas une chaîne de format est que vous utilisez la signature d'appel pour objet.tostring plutôt que d'utiliser plus spécifique double.Tostring < / code> ou décimal.tostring (tous deux ont des remplacements qui prennent une chaîne de format). Envisagez d'utiliser un décimal [] ou double [] ou list ou Liste pour votre oo variable


@Jamorison opposé problème. S'ils étaient des décimales, le code ici fonctionnerait, mais ils sont déjà en double.


@ Flydog57 J'ai lu les valeurs du fichier Excel. var attributs = parsedrow.itemarray.skip (4) .toarray (); var résultat = nouveau dictionnaire (stringcomparer.ordinonignorecase); pour (int i = 0; i et les attributs Array est un objet []. C'est pourquoi je ne peux pas convertir. parce qu'il y a aussi des valeurs de chaîne dans le fichier


String [] SS = OO.Sélectionnez (x => ((double) x) .tostring ("F9")). TOARRAY ();


Eh bien, vous n'avez pas précisé cela. S'ils ne sont pas tous doubles (/ décimales), passez à travers le tableau et strayez différemment basé sur le type. Les classes les plus utiles remplacent objet.tostring () . Beaucoup fournissent une surcharge. Si vous souhaitez effectuer différentes choses à différents types, vous devez écrire du code qui le fait


Modifiez votre question. Mettre cette information là-bas. Vous pouvez avoir plus d'un bloc de code. Si votre tableau a plus d'un type, montrez que dans votre exemple: objet [] OO = {0.000278121, 0.000078125, "Bonjour World"};


@ Flydog57 Désolé pour ne pas clarification. Édité.


4 Réponses :


2
votes

Premièrement, ce n'est pas un décimal , c'est un double . Utilisez 0.000278121M, 0.000078121M si vous voulez décimal s.

Forcer une représentation de chaîne pleine longueur sans exponentielle utilise .tostring ("0.#########################") pour le double. Avec décimal, la valeur par défaut est-ce donc .tostring () comme vous le feriez bien.


0 commentaires

0
votes

au lieu de la ligne ci-dessous: xxx

Vous pouvez utiliser ci-dessous la ligne de votre code:

Je suppose que 10 représentent un nombre maximum de chiffres décimaux que vous pouvez avoir dans le Entrées d'entrée. S'il y a plus, changez N10 à un autre nombre. xxx


0 commentaires

0
votes

Si vous avez une collecte disparate d'objets, traitez chaque type différemment:

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());
    }
}


1 commentaires

C'est bon. Envisager d'accepter la réponse et / ou le voter à nouveau.



0
votes

Je pense que vous pouvez utiliser la méthode double.Tostring (string). Voir: https: // docs.microsoft.com/en-us/dotnet/api/system.double.tostring?view=netFramework-4.7.2#system_double_tostring_system_string_

Le paramètre peut être des chaînes de format numérique personnalisées ( https://docs.microsoft.com/fr- US / DotNet / Standard / Types de base / Cordes personnalisées-format-format ) ou chaînes de format numériques standard ( https://docs.microsoft.com/en-us/dotnet/standard/base- Types / Standard-Numériques-Format-Strings? Vue = NetFramework-4.7.2 # Nformatures ). P>

Le spécificateur de précision du spécificateur de format "N" doit être compris entre 0 et 99 (N0 ~ N99), sinon la méthode de totrage renvoie la chaîne transmise en tant que paramètre. Vous pouvez faire double.tostring ("n99") code>, qui retournera la chaîne sous forme numérique dans sa plus haute précision. Le problème avec ceci est que si vous faites 0.000078125.tostring ("N99") code>, la sortie aurait beaucoup de traction 0S, comme: 0.0000781250000000000 ... Code>. P>

Pour surmonter cela, vous pouvez utiliser la méthode String.trimend (Char). 0.000078125.TOSTRING ("N99"). Trimend ('0') va couper les zéros de fin, la sortie peut donc être 0,000078125. P>

dans l'exemple de code donné, cela peut être appliqué comme suit: P >

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;
        }
    }
}


1 commentaires

En outre, d'autres ont souligné, mais les chiffres avec point décimal désignent double littéral. Si vous voulez que ce soit le littéral de décimal , il doit être suivi de m ou si vous voulez que ce soit float littéral, ' F'.