Moyen plus facile de prévenir les numéros de montrer en exposant la notation
Je vais compter sur le fait de dire qu'aucune question n'est une question stupide, mais j'ai un peu stupide de demander.
EDIT:
Semble que cette question a été posé et répondu à quelques reprises ici déjà, mais à l'aide de titres que je n'ai pas rencontré lors de la recherche de doublons. Voici quelques related posts:
- Double pour la conversion de chaîne sans notation scientifique
- Comment convertir le double de chaîne sans la puissance de 10 la représentation (E-05)
- Place avec une réponse (Jon Skeet): http://www.yoda.arachsys.com/csharp/DoubleConverter.cs
Question D'Origine:
J'ai une application que, parfois, les magasins de certains décemment petit nombre, comme 0.000023425
. Ces nombres sont chargés en TextBox
contrôles pour les utilisateurs à modifier. Le inventée suivant montre l'exemple de mon problème:
Dim number As Double = 0.000023425
someTextBox.Text = number.ToString() ' Shows "2.3425E-05"
Comme mentionné, le texte qui apparaît est 2.3425E-05
, qui n'est pas très intuitive pour l'utilisateur de voir, en plus j'ai des numéros encore plus précis (à 19 chiffres après la virgule). Je voudrais la sortie à point fixe. Bien sûr, je pourrais facilement et proprement le faire:
number.ToString("F20") ' Shows "0.00002342500000000000"
Mais ensuite il y a une fâcheuse nombre de zéros à gauche. Donc, pour remédier à cela, j'ai pu faire:
number.ToString("#,##0.####################") ' Shows "0.000023425"
Qui est ce que je veux, mais est-il une meilleure façon de le faire que l'avoir géant laid chaîne de format? Alors, ok, c'est pas moche, mais il y a certainement une manière différente, non? Mon but est de montrer la valeur brute être stockées dans la base de données d'une manière amicale, et je préfère ne pas avoir à forcer un format sur le nombre.
Merci!
Mise à JOUR
Peut-être je l'ai dit un peu trop dans le post. Après quelques essais, j'ai trouvé que le fait de changer le type de données sous-jacente à Decimal
résout le problème.
Dim number As Decimal = 0.000023425
someTextBox.Text = number.ToString() ' Shows "0.000023425" instead of "2.3425E-05"
Il semble donc qu'il Double
s ne sont pas assez précis pour être affiché normalement?
MODIFIER
Je trouvé un post (mais sans upvotes) qui rejette simplement le Double de la valeur comme un nombre Décimal avant de faire un .ToString()
sur elle, ce qui a l'effet désiré. Est-il une raison pourquoi je ne voudrais pas le faire? Peut-être le casting de Decimal
a le potentiel pour mettre fin à une valeur différente de celle de la Double
(même si c'est une quantité négligeable), donc peut-être la #,##0.#################...
chaîne de format est plus sûr.
Jetez un oeil à cette-stackoverflow.com/questions/1546113/.... Jon Skeet utilitaire de la classe a l'air prometteur.
Oh et BTW - ce n'est certainement PAS une question stupide!
Je n'ai que comme un exemple. Mon but est de ne pas avoir à formater le numéro à faire afficher correctement.
Jon classe utilitaire est exactement la solution que je voulais, mais il semble exagéré. Je n'ai pas vraiment besoin de plus de 19 ans de chiffres de précision, et la base de données ne va pas prendre quelque chose de plus grand qu'un double de la précision, de toute façon (il n'). Si vous modifiez votre commentaire dans une réponse je serai heureux de l'accepter comme réponse.
OriginalL'auteur Cᴏʀʏ | 2009-10-21
Vous devez vous connecter pour publier un commentaire.
Faire de votre format de chaîne de caractères une constante (mot à dire dans votre fichier de ressources) et de l'utilisation par son nom. Vous éviter de voir le laid format et le gain de cohérence de contrôle en contrôle de votre format (c'est à dire, si vous changez d'avis, tous les contrôles de gain le nouveau look).
Comme une alternative (ou en parallèle), et d'en tirer un contrôle personnalisé dans la zone de texte et ont des propriétés qui les invoquent les différentes chaînes de mise en forme que vous souhaitez utiliser plus facilement la syntaxe.
Soit votre objectif doit être de ne pas se répéter... en plaçant la configuration dans un seul endroit, vous éviter les erreur de frappe, il finit par avoir à traquer une étrange mise en forme de bug.
Nous faire quelque chose de similaire en créant des "%" et "monnaie" contrôles de texte qui contient la mise en forme et l'analyse des exigences. Ils fonctionnent exactement comme les contrôles de texte autrement.
Évidemment, ce que vous avez trouvé est plus simple. Double n'est pas aussi "précis" comme séparateur Décimal (qui est conçu pour traiter avec décimale montants en devises sans binaire questions d'arrondi). Si vous ne projeter sur l'écran, je soupçonne que dans la plupart des cas, il fonctionne. Cependant, la double ne souffrent de problèmes si vous effectuez des calculs où vous obtenez 0.9999999 type de résultats au lieu de 1.0 . Si ce n'est pas un problème, le jette serait suffisant. Pourtant, avoir un "%" et "monnaie" de contrôle dédié prend beaucoup de conjectures et de la redondance de la question.
Pour répondre à la question du "pourquoi" question... le formateur par défaut (qui est ce que ToString() utilise) arrive à renverser des scientifiques à l'extérieur d'une fourchette relativement étroite. C'est pourquoi vous devez utiliser un format explicite pour obtenir ce que vous voulez. (Vous n'êtes pas réellement la conversion d'une chose à une autre, ils sont tout simplement des sorties différentes représentations de la même chose.)
OriginalL'auteur Godeke