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
4 Réponses :
Premièrement, ce n'est pas un Forcer une représentation de chaîne pleine longueur sans exponentielle utilise décimal code>, c'est un
double code>. Utilisez
0.000278121M, 0.000078121M code> si vous voulez
décimal code> s. P>
.tostring ("0.#########################") code> pour le double. Avec décimal, la valeur par défaut est-ce donc
.tostring () code> comme vous le feriez bien. P>
au lieu de la ligne ci-dessous: Vous pouvez utiliser ci-dessous la ligne de votre code: p> 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. P>
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()); } }
C'est bon. Envisager d'accepter la réponse et / ou le voter à nouveau.
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 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 > 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>
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;
}
}
}
En outre, d'autres ont souligné, mais les chiffres avec point décimal désignent double code> littéral. Si vous voulez que ce soit le littéral de
décimal code>, il doit être suivi de
m code> ou si vous voulez que ce soit
float code> littéral, ' F'.
Vous pouvez spécifier le format que vous souhaitez comme paramètre sur double.Tostring () . En utilisant
objet [] code> au lieu de
double [] code> Vous n'autorise pas votre code à utiliser
double.tostring () code> mais seulement le < code> objet.tostring () code> 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) code> au lieu de
tostring () code>
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 code>, par voie, ils sont
double code>. Si vous voulez des décimales, vous devez suffixer le numéro avec un "M":
objet [] OO = {0.000278121M, 0.000078125M}; code> 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 code> ne prend pas une chaîne de format est que vous utilisez la signature d'appel pour
objet.tostring code> plutôt que d'utiliser plus spécifique
double.Tostring < / code> ou
décimal.tostring code> (tous deux ont des remplacements qui prennent une chaîne de format). Envisagez d'utiliser un
décimal [] code> ou
double [] code> ou
list code> ou
Liste code> pour votre
oo code> 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 (); CODE>
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 () code>. 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"}; Code>
@ Flydog57 Désolé pour ne pas clarification. Édité.