2010-01-07 9 views
2

Y a-t-il une fonction comme int() qui peut convertir une chaîne en valeur flottante? J'utilise actuellement le code suivant:Comment puis-je convertir une chaîne en float avec Perl?

$input=int(substr($line,1,index($line,",")-1)); 

Je dois convertir la chaîne retournée par substr flotter.

+0

pouvez-vous donner un exemple de la façon dont '$ line' est généré? –

+0

$ ligne est lue à partir d'un fichier journal. ouvrir (fHandle, "+ <", $ path) ou mourir "$!"; foreach $ ligne () \t \t {\t {\t $ input = int (substr ($ ligne, 1, index ($ ligne, ",") - 1)); } Ceci est le code complet. – fixxxer

+0

Pouvons-nous avoir un exemple de ligne de votre fichier s'il vous plaît afin que nous puissions suggérer de meilleures façons d'extraire le nombre. – slebetman

Répondre

17

Il suffit de l'utiliser. En Perl, une chaîne qui ressemble à un nombre est un nombre.

Maintenant, si vous voulez être sûr que la chose est un nombre avant l'utiliser alors il y a une méthode utilitaire dans Scalar::Util qui le fait:

use Scalar::Util qw/looks_like_number/; 

$input=substr($line,1,index($line,",")-1); 

if (looks_like_number($input)) { 
    $input += 1; # use it as a number! 
} 

Sur la base de l'entrée de l'échantillon vous avez laissé dans le commentaires, une méthode plus robuste d'extraire le nombre est:

$line =~ /([^\[\],]+)/; # <-- match anything not square brackets or commas 
$input = $1;   # <-- extract match 
+1

Lorsque j'utilise le sous tel quel, j'obtiens l'erreur suivante: L'argument "1258200601.5027449" n'est pas numérique dans int at test.pl – fixxxer

+1

Si c'est vraiment l'erreur, alors votre numéro contient une virgule qui ne le fait pas un numéro. – slebetman

+0

Modifier: enlevé int() parce que vous vouliez float ... @fixxxer: désolé, je copier/coller de votre exemple. – slebetman

1

Je ne sais pas ce que vos données ressemble, mais vous ne me rends compte que le troisième argument de substr est une longueur, non une position, non? En outre, la première position est 0. Je suppose que vous n'obtenez pas les données que vous pensez obtenir, et cela fonctionne le plus souvent accidentellement parce que vous commencez au début de la chaîne et ne sont que d'une unité.

+0

Les données commencent par un "[" .so il est sage que nous commençons avec 0 et non 1 comme deuxième argument à substr.Ofcourse, le troisième doit être un nombre.Qu'est-ce que dans le code, vous fait penser que nous négligé cela? – fixxxer

+1

L'index() me fait penser que vous avez oublié cela, et le fait que vous n'extrayez pas quelque chose que Perl pense est un nombre. Montrez-nous un exemple complet avec des données d'entrée afin que nous n'ayons pas à deviner. –

Questions connexes