IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

problème avec Excel et nombre de décimales


Sujet :

Langage Perl

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut problème avec Excel et nombre de décimales
    Bonjour,

    J'ai une fonction qui récupère la valeur d'une cellule d'une feuille Excel et retourne cette valeur mise en forme selon le schéma suivant:
    - on ajoute ".0" à un entier
    - on ajoute un certain nombre de "0" à un nombre décimal afin d'avoir un total de 8 décimales
    Si la cellule est vide, on retourne "0.0"

    Voici ladite fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sub real {	
    	my $real;
    	my $nb = $_[0];
    	if ($nb =~ /[+-]?(\d+)\.(\d+)/) {
    		$real = substr($1 . "." . $2 . "0000000",0,length($1)+9);
    		if ($nb =~ /-\d+/) {
    			$real = "-" . $real;
    		}
    	} elsif ($nb =~ /[+-]?\d+/) {
    		$real = $nb . ".0";
    	} else {
    		$real = "0.0";
    	}
    	return $real;
    }
    Tout avait l'air de fonctionner mais j'ai rencontré un problème.
    Lorsque la cellule contient 0.00015, j'obtiens comme désiré 0.00015000, mais pour 0.000015 ou 0.0000015, j'obtiens -1.50000000 et je n'arrive pas à trouver la source de cette erreur.
    Cela vient peut-être d'Excel et du nombre de décimales, mais une fonction similaire contenue dans une macro en visual basic donnait le bon résultat.

    Merci de m'apporter votre aide =)

  2. #2
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    sprintf n'aporterait une solution plus élégante ?

    Z.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ah oui en effet ça a l'air intéressant!
    Je vais essayer de faire quelque chose avec.

    Merci =)

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je n'arrive pas encore à maîtriser sprintf (ou pack) mais j'imagine que ce serait juste pour remplacer mon substr().
    Or, je ne suis pas certain que mon problème vienne de là.

    Autre problème : j'obtiens 1e-007.0 dans la cellule contenant le résultat retourné lorsque je souhaiterais avoir 0.00000010, toujours avec la même fonction.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ok ça marche mieux avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sub real {	
    	my $real;	
    	my $nb = $_[0];
    	if ($nb =~ /[+-]?(\d+)\.(\d+)/) {
    		$real = sprintf("%.8f", $nb);
    	} elsif ($nb =~ /[+-]?\d+/) {
    		$real = $nb . ".0";
    	} else {
    		$real = "0.0";
    	}
    	return $real;
    }
    En effet c'est plus élégant et surtout ça marche mieux!

    Il me reste toujours le mystère du 1e-007.0 à élucider =)

    Merci.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je reformule mon problème :

    J'ai une cellule contenant 0,0000001 et je souhaite obtenir 0.00000010 dans une autre, mais à la place j'obtiens 1e-007.0

    Voici l'appel de ma fonction real :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Book->Worksheets("param_SF08")->Cells(21,3)->{'value'} = &real($Book->Worksheets("SF08")->Cells(51,3)->{'Value'});
    Mon programme est destiné à mettre à jour les cellules si jamais il y avait des modifications en amont, c'est pourquoi je dois utiliser ma fonction real au lieu de simplement corriger le problème à la main.

    J'ai aussi essayé de recopier juste le contenu de ma cellule, sans utiliser la fonction, et en modifiant le format de la cellule (format nombre, 8 décimales) j'obtiens 0,00000010. Cela pourrait convenir, sauf que je veux un point à la place de la virgule, et cette méthode ne me parait pas non plus très rigoureuse.

    La fonction codée à l'origine en Visual Basic, fonctionnelle, donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Function reel(nombre)
     
    If Len(Abs(nombre) - Int(Abs(nombre))) > 1 Then
        If Sgn(nombre) = -1 Then
            reel = "-" & Int(Abs(nombre)) & "." & Right(Format(Abs(nombre) - Int(Abs(nombre)), "#0.00000000"), 8)
        Else
            reel = Int(Abs(nombre)) & "." & Right(Format(Abs(nombre) - Int(Abs(nombre)), "#0.00000000"), 8)
        End If
    Else
        If Sgn(nombre) = -1 Then
            reel = "-" & Int(Abs(nombre)) & ".0"
        Else
            reel = Int(Abs(nombre)) & ".0"
        End If
    End If
     
    End Function
    J'ai toujours pas trouvé de solution rigoureuse à mon problème, et parmi les centaines de cellules utilisant ma fonction real, seule cette cellule me pose problème.

    Merci pour votre aide!

Discussions similaires

  1. Problème avec un format nombre en VBA Excel
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/11/2008, 10h44
  2. Problème avec Excel et Paradox
    Par Ninjodo dans le forum Bases de données
    Réponses: 30
    Dernier message: 05/11/2007, 07h35
  3. Réponses: 3
    Dernier message: 28/12/2006, 15h06
  4. Problème avec Excel et tableau croisé dynamique
    Par françois62 dans le forum VBScript
    Réponses: 9
    Dernier message: 19/11/2006, 22h17
  5. [MFC] [CRecordset] Problème avec Excel
    Par Yellowmat dans le forum MFC
    Réponses: 4
    Dernier message: 20/07/2005, 15h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo