Connaitre le nombre de chiffres après la virgule d'un nombre

Résolu
Signaler
Messages postés
29
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
1 septembre 2008
-
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
-
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!

57 réponses

Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
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 !
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
"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.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
29
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
1 septembre 2008

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
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
3
<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

Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
3




resultat=right(


str(MyVal1),

len(str


(


MyVal1


))-


len(str


(


MyLong1




)))
flute!


Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
Dim

s()


As





String








Dim

x


As





Double

Math.PIs x.ToString.Split(



","

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






Bonjour chez vous !
Messages postés
29
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
1 septembre 2008

merci super super astucieux je vais essayer
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
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  
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
culture oui ok c'est  1 plus

Bonjour chez vous !
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
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...
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
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 !
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
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
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
[MODE J'AI BU]
Différence entre le nombre et son entier
J'AI BU
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
3
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.
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
3
j'avais pas vu que ça avait avavcé comme ça!
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
3
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
Messages postés
109
Date d'inscription
dimanche 27 juillet 2008
Statut
Membre
Dernière intervention
2 février 2012
3
ou Math.Truncate<!---->

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

Calcule la partie entière d'un nombre.