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

Dagry 29 Messages postés samedi 17 mars 2007Date d'inscription 1 septembre 2008 Dernière intervention - 29 août 2008 à 21:27 - Dernière réponse : Kevin.Ory 843 Messages postés mercredi 22 octobre 2003Date d'inscription 7 janvier 2009 Dernière intervention
- 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

57 réponses

Kevin.Ory 843 Messages postés mercredi 22 octobre 2003Date d'inscription 7 janvier 2009 Dernière intervention - 2 sept. 2008 à 10:13
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Kevin.Ory
gillardg 3288 Messages postés jeudi 3 avril 2008Date d'inscription 14 septembre 2014 Dernière intervention - 2 sept. 2008 à 11:35
+3
Utile
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 !
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de gillardg
Kevin.Ory 843 Messages postés mercredi 22 octobre 2003Date d'inscription 7 janvier 2009 Dernière intervention - 2 sept. 2008 à 15:47
+3
Utile
"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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Kevin.Ory
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 29 août 2008 à 21:47
0
Utile
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
Dagry 29 Messages postés samedi 17 mars 2007Date d'inscription 1 septembre 2008 Dernière intervention - 29 août 2008 à 22:26
0
Utile
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
cs_candyraton 109 Messages postés dimanche 27 juillet 2008Date d'inscription 2 février 2012 Dernière intervention - 29 août 2008 à 22:26
0
Utile
<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
cs_candyraton 109 Messages postés dimanche 27 juillet 2008Date d'inscription 2 février 2012 Dernière intervention - 29 août 2008 à 22:30
0
Utile




resultat=right(


str(MyVal1),

len(str


(


MyVal1


))-


len(str


(


MyLong1




)))
flute!


Commenter la réponse de cs_candyraton
gillardg 3288 Messages postés jeudi 3 avril 2008Date d'inscription 14 septembre 2014 Dernière intervention - 29 août 2008 à 23:25
0
Utile
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
Dagry 29 Messages postés samedi 17 mars 2007Date d'inscription 1 septembre 2008 Dernière intervention - 30 août 2008 à 00:07
0
Utile
merci super super astucieux je vais essayer
Commenter la réponse de Dagry
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 30 août 2008 à 01:04
0
Utile
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
gillardg 3288 Messages postés jeudi 3 avril 2008Date d'inscription 14 septembre 2014 Dernière intervention - 30 août 2008 à 01:08
0
Utile
culture oui ok c'est  1 plus

Bonjour chez vous !
Commenter la réponse de gillardg
Kevin.Ory 843 Messages postés mercredi 22 octobre 2003Date d'inscription 7 janvier 2009 Dernière intervention - 30 août 2008 à 02:02
0
Utile
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
gillardg 3288 Messages postés jeudi 3 avril 2008Date d'inscription 14 septembre 2014 Dernière intervention - 30 août 2008 à 11:52
0
Utile
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
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 30 août 2008 à 12:14
0
Utile
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
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 30 août 2008 à 12:23
0
Utile
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
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 30 août 2008 à 13:30
0
Utile
[MODE J'AI BU]
Différence entre le nombre et son entier
J'AI BU
Commenter la réponse de jmfmarques
cs_candyraton 109 Messages postés dimanche 27 juillet 2008Date d'inscription 2 février 2012 Dernière intervention - 30 août 2008 à 13:55
0
Utile
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
cs_candyraton 109 Messages postés dimanche 27 juillet 2008Date d'inscription 2 février 2012 Dernière intervention - 30 août 2008 à 13:56
0
Utile
j'avais pas vu que ça avait avavcé comme ça!
Commenter la réponse de cs_candyraton
cs_candyraton 109 Messages postés dimanche 27 juillet 2008Date d'inscription 2 février 2012 Dernière intervention - 30 août 2008 à 14:17
0
Utile
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
cs_candyraton 109 Messages postés dimanche 27 juillet 2008Date d'inscription 2 février 2012 Dernière intervention - 30 août 2008 à 14:19
0
Utile
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.

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