Connaitre le nombre de chiffres après la virgule d'un nombre [Résolu]

Messages postés
29
Date d'inscription
samedi 17 mars 2007
Dernière intervention
1 septembre 2008
- - Dernière réponse : Kevin.Ory
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
- 12 sept. 2008 à 21:45
Bonjour à tous! je me tourne encore vers vous pour m'aider à résoudre un problème. J'aimerais savoir comment connaitre le nombre de chiffres après la virgule d'un nombre décimal. je compte sur vous. merci de votre aide!
Afficher la suite 

Votre réponse

20/57 réponses

Meilleure réponse
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
3
Merci
Un formulaire avec TextBox1 (pour entrer une valeur), TextBox2 (pour afficher la conversion Double.ToString) et Label1 (pour afficher le nombre de décimales) :

Try
    Dim value As Double = TextBox1.Text
    Dim sValue As String = value.ToString("R", Globalization.CultureInfo.InvariantCulture)
    Dim nbrDec As Integer = 0

    If sValue.Contains("E") Then
        ' Nottation scientifique
        Dim integral As String = sValue.Substring(0, sValue.IndexOf("E"))
        Dim exponent As String = sValue.Substring(sValue.IndexOf("E") + 1)
        If integral.Contains(".") Then _
            nbrDec = integral.Length - integral.IndexOf(".") - 1
        If exponent.Contains("-") Then _
            nbrDec -= exponent
    Else
       ' Nottation standarde
        If sValue.Contains(".") Then _
            nbrDec = sValue.Length - sValue.IndexOf(".") - 1
        End If

        TextBox2.Text = sValue
        Label1.Text = nbrDec
    Catch ex As Exception
        TextBox2.Text = "Erreur"
        Label1.Text = ""
    End Try

End Sub

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Kevin.Ory
Messages postés
3288
Date d'inscription
jeudi 3 avril 2008
Dernière intervention
14 septembre 2014
3
Merci
Private





Sub

TextBox1_KeyDown(


ByVal

sender


As





Object

,


ByVal

e


As

System.Windows.Forms.KeyEventArgs)


Handles

TextBox1.KeyDown



If

e.KeyCode = Keys.Enter


Then








Dim

s()


As





String








Dim

x


As





Decimal








Decimal

.TryParse(TextBox1.Text, x)s = x.ToString.Split(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator)

MsgBox(x & vbCrLf & s(1).Length)



End





If








End





Sub
et ça fonctionne avec 123456789,123456789

Bonjour chez vous !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de gillardg
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
3
Merci
"et ça fonctionne avec 123456789,123456789"

Moi aussi avec Decimal à la place de Double

Sinon sympa l'utilisation de System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator, ça remplace mon Globalization.CultureInfo.InvariantCulture du ToString

Pour la notation scientifique, il semblerait en effet qu'un Decimal.ToString n'utilise jamais de notation scientifique, pourtant MSDN est clair: "Le nombre est converti dans le format le plus compact (virgule fixe ou
notation scientifique), selon le type du nombre et en fonction de la
présence d'un spécificateur de précision.". Mais c'est sur que ce test à ne pas faire raccourcis nettement le code.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Kevin.Ory
Messages postés
2117
Date d'inscription
lundi 11 avril 2005
Dernière intervention
14 mars 2016
0
Merci
Bonsoir,

Dans quel contexte cela s'inscrit ? La question est un peu vague... En effet, comment ton nombre décimal est-il formé ?

Si  tu le définis dans ton code, par exemple "a=41234.1234124" , ta question revient à demander : comment extraire la partie décimale.

Si il résulte d'un calcul, par exemple " a = 1/7 ", la réponse n'est plus informatique, mais mathématique... En effet, ici la partie décimale est infinie...

IL faudrait donc préciser plus ta question, et pourquoi tu as besoin d'extraire la partie décimale...

Amicalement,
Us.
Commenter la réponse de us_30
Messages postés
29
Date d'inscription
samedi 17 mars 2007
Dernière intervention
1 septembre 2008
0
Merci
d'accord. le nombre résulte d'un calcul. et dans le pire des cas si la partie décimale est énorme on se limite à 19 chiffres
Commenter la réponse de Dagry
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Dernière intervention
2 février 2012
0
Merci
<title>CLng, fonction, exemple</title>
<style><![CDATA[import url(msdn_ie4.css);]]></style>
<link disabled= "" href="msdn_ie3.css" rel="stylesheet" />

Dim MyVal1, MyVal2, MyLong1, MyLong2MyVal1 25427.45: MyVal2 25427.55   ' MyVal1, MyVal2 sont des valeurs    ' de type Double.
MyLong1 =  CLng( MyVal1)   ' MyLong1 contient 25427.
MyLong2  = CLng(MyVal2)   ' MyLong2 contient 25428.
ou tu le fait par les math:soustraction
ou par la chaine: len(str


(


MyLong1




)) renvoi le nbre de chiffres
resultat=right(


str(MyVal1),x


)'x etant le nbre de string a prendre
ça donne:




resultat=right(


str(MyVal1),

len(str


(


MyVal1


))-


len(str


(


MyLong1




))



c une façon de faire 
si ça peut t'aider
mais y'a peut etre une fonction vb qui le fait direct;
elles sont là http://msdn.microsoft.com/fr-fr/library/32s6akha(VS.80).aspx

Commenter la réponse de cs_candyraton
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Dernière intervention
2 février 2012
0
Merci




resultat=right(


str(MyVal1),

len(str


(


MyVal1


))-


len(str


(


MyLong1




)))
flute!


Commenter la réponse de cs_candyraton
Messages postés
3288
Date d'inscription
jeudi 3 avril 2008
Dernière intervention
14 septembre 2014
0
Merci
Dim

s()


As





String








Dim

x


As





Double

Math.PIs x.ToString.Split(



","

)MsgBox(x & vbCrLf & s(1).Length)






Bonjour chez vous !
Commenter la réponse de gillardg
Messages postés
29
Date d'inscription
samedi 17 mars 2007
Dernière intervention
1 septembre 2008
0
Merci
merci super super astucieux je vais essayer
Commenter la réponse de Dagry
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
outchhhhhh

un split pour un seul caractère?
en plus "," sans vérifier le séparateur?

SI on doit passer par la conversion string (pas certain), culture, indexof et substring si besoin de récupérer la valeur, sinon juste culture et length - indexof

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
Commenter la réponse de PCPT
Messages postés
3288
Date d'inscription
jeudi 3 avril 2008
Dernière intervention
14 septembre 2014
0
Merci
culture oui ok c'est  1 plus

Bonjour chez vous !
Commenter la réponse de gillardg
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
0
Merci
Non c'est obligatoire :)
Chez moi en Suisse, le séparateur est un point, tout comme la norme internationale d'ailleurs (chez Microsoft en tout cas). Ce code ne fonctionne donc pas chez moi.
De plus, la méthode ToString formate en notation scientifique dans certain cas: 0.00002 est formaté en "2E-05", plus de virgule!

Il faudrait savoir si la source du nombre est String ou un nombre flottant. Si c'est un string, on utilise de simple fonction pour les chaines de caractères comme la méthode de Gillardg. Entre parenthèse, voici un solution donnant le même résultat que Gillardg mais sans le Split (a utiliser lorsque la source est un String):
Dim value As String = "123456789.123456789"
Dim nbrDec As Integer = value.Length - value.IndexOf(".") - 1

Si la source est un nombre flottant (Single ou Double), ça semble plus compliqué. J'ai testé différent formats numérique, mais elles ne donnent pas le résultat escompté. Par exemple :
Dim value As Double = 123456789.12345679
Console.WriteLine(value.ToString("#.###################"))
Ceci affiche 123456789.123457. Pourquoi les 2 derniers chiffres sont-il perdu?
Le seul format qui affiche toutes les décimales, est le format "R" pour "Round-Trip" (Aller-retour): "Le spécificateur d'aller-retour garantit qu'une valeur numérique convertie en chaîne sera analysée dans la même valeur numérique". Je ne comprend pas bien cette phrase, la version en anglais me parle plus: "The round-trip specifier guarantees that a numeric value converted to a string will be parsed back into the same numeric value"
Il s'agit apparemment du format utilisé par IntelliSense.
Le hic, c'est que ce format convertit aussi en notation scientifique pour simplifier le résultat (0.0000000000000001 devient "1E-16")

Gérer manuellement les exposants? Mouais, c'est pas très élégant...
Commenter la réponse de Kevin.Ory
Messages postés
3288
Date d'inscription
jeudi 3 avril 2008
Dernière intervention
14 septembre 2014
0
Merci
keven 
 "Dim nbrDec As Integer = value.Length - value.IndexOf(".") - 1 "

Cint(123.123)  => ça donne 123 donc avec le integer tu n'aurras pas la valeur décimale

Bonjour chez vous !
Commenter la réponse de gillardg
Messages postés
3181
Date d'inscription
dimanche 15 février 2004
Dernière intervention
9 avril 2017
0
Merci
Salut,

Un peu de regex :

Imports System.Text.RegularExpressions
Imports System.Globalization.CultureInfo

' ..........

Private Function GetNbDecimal(ByVal n As Double) As Integer
  Dim RegMath As Match = Regex.Match(n.ToString("R"), _
    String.Format("([0-9]+)([{0}]([0-9]+))?(E([+-][0-9]+))?", _
    CurrentCulture.NumberFormat.CurrencyDecimalSeparator))
  Dim sDecimal As String = String.Empty, iExp As Integer = 0, NbDecimal As Integer = 0
  If RegMath.Groups(3).Success Then sDecimal = RegMath.Groups(3).Value
  If RegMath.Groups(5).Success Then iExp = Integer.Parse(RegMath.Groups(5).Value)
  If Not String.IsNullOrEmpty(sDecimal) Then NbDecimal = sDecimal.Length
  NbDecimal -= iExp
  If NbDecimal > 0 Then Return NbDecimal Else Return 0
End Function

__________
  Kenji
Commenter la réponse de Charles Racaud
Messages postés
3181
Date d'inscription
dimanche 15 février 2004
Dernière intervention
9 avril 2017
0
Merci
Juste un petit soucis avec la culture ou je me suis planté :

Private Function GetNbDecimal(ByVal n As Double) As Integer
  Dim RegMath As Match = Regex.Match(n.ToString("R"), _
    String.Format("([0-9]+)([{0}]([0-9]+))?(E([+-][0-9]+))?", _
    InstalledUICulture.NumberFormat.NumberDecimalSeparator))
  Dim sDecimal As String = String.Empty, iExp As Integer = 0, NbDecimal As Integer = 0
  If RegMath.Groups(3).Success Then sDecimal = RegMath.Groups(3).Value
  If RegMath.Groups(5).Success Then iExp = Integer.Parse(RegMath.Groups(5).Value)

  If Not String.IsNullOrEmpty(sDecimal) Then NbDecimal = sDecimal.Length
  NbDecimal -= iExp
  If NbDecimal > 0 Then Return NbDecimal Else Return 0
End Function
<!-- Coloration syntaxique vb/vba/vb.net : http://charles.racaud.free.fr/code-syntaxing/ -->
Coloration syntaxique vb/vba/vb.net

__________
  Kenji
Commenter la réponse de Charles Racaud
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
0
Merci
[MODE J'AI BU]
Différence entre le nombre et son entier
J'AI BU
Commenter la réponse de jmfmarques
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Dernière intervention
2 février 2012
0
Merci
123456789.123457. Pourquoi les 2 derniers chiffres sont-il perdu?
surement parceque c un double(8 octets),non?

En vous ecoutant, j'ai pensé ah! plein de choses (utiles) a apprendre mais
culture g pas trouvé
indexof  est de la classe compareinfos (je vois pas l'avantage par rapport a split)
substring  'Visual J# Reference
je vois pas ce que vous voulez dire mais c pas grave.

En tout cas, on a l'air tous d'accord que le mieux semble étre de convertir en string pour la manip, avant de reconvertir au format d'origine.

à moins que quelqu'un nous trouve quelquechose d'autre (math) que par ex (j'avais envie d'essayer):
Dim myval As Double
Dim result As Double
myval = 4587.45'par exIf myval > cDbl(CLng(myval)) Then result myval - CDbl(CLng(myval)) Else result 1 - (CDbl(CLng(myval)) - myval)
(merci de corriger mes fautes, je fais pas une demo, je fais juste avancer le schmilblic)

Mais voilà, ça renvoi 0.449999999999818!!???

Allez les pros, dites-nous tout.
Commenter la réponse de cs_candyraton
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Dernière intervention
2 février 2012
0
Merci
j'avais pas vu que ça avait avavcé comme ça!
Commenter la réponse de cs_candyraton
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Dernière intervention
2 février 2012
0
Merci
g trouvé aussi

dans Bibliothèque de classes .NET Framework<!---->

Math.Round, méthode (Double)<!---->
<!--Content type: DocStudio. Transform: devdiv2mtps.xslt.-->
Arrondit une valeur à virgule flottante double précision à l'entier le plus proche.

c surement mieux que CLng
Commenter la réponse de cs_candyraton
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Dernière intervention
2 février 2012
0
Merci
ou Math.Truncate<!---->

<!--Content type: DocStudio. Transform: devdiv2mtps.xslt.-->

Calcule la partie entière d'un nombre.
Commenter la réponse de cs_candyraton

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.