Eternel séparateur point ou virgule

Signaler
Messages postés
232
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012
-
Messages postés
8
Date d'inscription
mercredi 3 mars 2004
Statut
Membre
Dernière intervention
12 août 2009
-
Bonjour, nouveau au C# je rencontre les problèmes que je connaissais en VB6.
Pourtant je me rends compte que je developpe plus vite (Quizz, plus on vieillit plus on code vite alors ?? )

Bon alors mon problème est que j'ai des utilisateurs francophones où leurs séparateurs décimals est tantot un point tantot une virgule et pis parfois une virgule en décimal et un point en millier ! Trop cool pour le développeur.

Il m'envoi parfois des XML avec des singles en . ou en ,

Mon idéal est que dans un XML on stocke quelque soit la culture rien en séparateur de millier et le Point en décimal. Mais y'a parfois un peu de tout

et donc en C# j'ai tenté plusieurs choses comme :

Moi j'ai le point en séparateur :

si Nodes.Current.Value=12,34

m_fTotalHour = float.Parse(Nodes.Current.Value,culture.NumberFormat); // renvoi 1234.00
m_fTotalHour = float.Parse(Nodes.Current.Value, CultureInfo.InvariantCulture.NumberFormat);//renvoi 0.0
m_fTotalHour = float.Parse(Nodes.Current.Value, CultureInfo.NumberFormat);//renvoi 0.0


Y'a autre chose ?

En VB6 j'avais donc créer une fonction qui lit tout comme ceci:

Public Function fctValeur(ByVal Nombre As Variant) As Double
'lit 123.456,78 renvoi 123456.78
'lit 123456.78 renvoi 123456.78
'lit 123456,78 renvoi 123456.78
    If Trim(Nombre) = "" Then
        fctValeur = 0
        Exit Function
    End If

    Dim i As Long
    Dim j As Long
    i = InStrRev(Nombre, ".")
    j = InStrRev(Nombre, ",")
    If j > i Then
        i = j
    End If

    Dim lD As Long
    If i > 0 Then
        lD = Val(Mid(Nombre, i + 1))

        Nombre = Mid$(Nombre, 1, i - 1)
    End If

    Dim strTmp As String
    Dim charTmp As String

    For i = 1 To Len(Nombre)
        charTmp = Mid(Nombre, i, 1)
        If Asc(charTmp) >= 48 And Asc(charTmp) <= 57 Then
            strTmp = strTmp & charTmp
        ElseIf charTmp "+" Or charTmp "-" Then
            ' Le signe...
            strTmp = strTmp & charTmp
        ElseIf charTmp " " Or charTmp "." Or charTmp = "," Then
        End If
    Next i
    
    Dim SeparateurDecimal As String
    SeparateurDecimal = fctParamRegional(LOCALE_SDECIMAL)
    fctValeur = Val(strTmp) & SeparateurDecimal & lD

end sub


Y'a t il une nouveau astuce en C# ou dois-je la recomposé pour C# ?
Merci !

2 réponses

Messages postés
72
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
12 août 2009
2
Qu'est-ce que c'est que ça pour des utilisateurs ? Mets-nous tous ça au pas en leur renvoyant sur les bras tout ce qui n'est pas formatté de façon requise !

Les surcharges de Single.Parse vont lire le chaîne de caractères selon une culture spécifique. Mais je ne pense pas qu'il existe de fonction magique qui devine la culture ...

La règle générale c'est que l'affichage peut être sensible à la culture, mais tout ce qui est interne devrait être insensible à la culture. http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx

Une solution serait de récupérer la CultureInfo.CurrentCulture du thread en cours, ou bien d'ajouter une option afin que l'utilisateur choisisse.

Sinon tu peux essayer Single.Parse (Nombre, System.Globalization.CultureInfo.InvariantCulture.NumberFormat). Pas de séparateur de milliers et le point en décimal, comme tu le désires, le tout dans un try-catch car il va se mettre à hurler aussitôt qu'il verra passer une virgule. A partir du catch, tu peux alors recommencer le traitement dans une autre culture ou, mieux, envoyer à l'utilisateur un gros message d'erreur pour lui apprendre les bonnes manières.

Il faudrait que tu nous précises dans quel contexte tout cela fonctionne.

Mathieu.
Messages postés
8
Date d'inscription
mercredi 3 mars 2004
Statut
Membre
Dernière intervention
12 août 2009

Bonsoir,

ça peut peut être t'aider : numberformatinfo

Si l'application qui génère les fichiers XML peut être modifiées tu peux te baser sur CultureInfo ou plus spécifiquement NumberFormatInfo.

@+