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

Résolu
Dagry Messages postés 29 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 1 septembre 2008 - 29 août 2008 à 21:27
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre 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!

57 réponses

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
2 sept. 2008 à 10:13
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
3
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
2 sept. 2008 à 11:35
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 !
3
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
2 sept. 2008 à 15:47
"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.
3
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 août 2008 à 21:47
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Dagry Messages postés 29 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 1 septembre 2008
29 août 2008 à 22:26
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
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
29 août 2008 à 22:26
<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

0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
29 août 2008 à 22:30




resultat=right(


str(MyVal1),

len(str


(


MyVal1


))-


len(str


(


MyLong1




)))
flute!


0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
29 août 2008 à 23:25
Dim

s()


As





String








Dim

x


As





Double

Math.PIs x.ToString.Split(



","

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






Bonjour chez vous !
0
Dagry Messages postés 29 Date d'inscription samedi 17 mars 2007 Statut Membre Dernière intervention 1 septembre 2008
30 août 2008 à 00:07
merci super super astucieux je vais essayer
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
30 août 2008 à 01:04
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  
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
30 août 2008 à 01:08
culture oui ok c'est  1 plus

Bonjour chez vous !
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
30 août 2008 à 02:02
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...
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
30 août 2008 à 11:52
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 !
0
Utilisateur anonyme
30 août 2008 à 12:14
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
0
Utilisateur anonyme
30 août 2008 à 12:23
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
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
30 août 2008 à 13:30
[MODE J'AI BU]
Différence entre le nombre et son entier
J'AI BU
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
30 août 2008 à 13:55
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.
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
30 août 2008 à 13:56
j'avais pas vu que ça avait avavcé comme ça!
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
30 août 2008 à 14:17
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
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
30 août 2008 à 14:19
ou Math.Truncate<!---->

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

Calcule la partie entière d'un nombre.
0