Comment convertir une chaîne contenant un nombre en sa valeur numérique en Perl?Comment puis-je convertir une chaîne en nombre en Perl?
Répondre
Vous n'avez pas besoin de convertir du tout:
% perl -e 'print "5.45" + 0.1;'
5.55
5.55 n'est pas un nombre entier – OrangeDog
@OrangeDog L'OP a édité la question (quelques mois après que cette réponse a été postée) - la question originale contenait en fait des nombres à virgule flottante. – Alnitak
qu'en est-il des comparaisons quand la chaîne contient une virgule? – Ramy
Perl a vraiment que trois types: scalaires, les tableaux et hash. Et même cette distinction est discutable. ;) La façon dont chaque variable est traitée dépend de ce que vous en faites:
% perl -e "print 5.4 . 3.4;"
5.43.4
% perl -e "print '5.4' + '3.4';"
8.8
Perl a beaucoup plus de types que, mais pour les valeurs simples, c'est juste un valeur unique. –
vous pouvez également ajouter 0 –
Perl est un langage contextuel. Il ne fait pas son travail selon les données que vous lui donnez. Au lieu de cela, il détermine comment traiter les données en fonction des opérateurs que vous utilisez et du contexte dans lequel vous les utilisez. Si vous faites des nombres sortes de choses, vous obtenez des chiffres:
# numeric addition with strings:
my $sum = '5.45' + '0.01'; # 5.46
Si vous faites chaînes sortes de choses, vous obtenez des chaînes:
# string replication with numbers:
my $string = (45/2) x 4; # "22.522.522.522.5"
Perl figure la plupart du temps ce qu'il faut faire et c'est surtout à droite. Une autre façon de dire la même chose est que Perl se soucie plus des verbes que des noms.
Etes-vous en train d'essayer de faire quelque chose et cela ne fonctionne pas?
Pardonnez mon manque de connaissances ici, mais je ne comprends pas vraiment votre deuxième exemple. Vous divisez deux nombres, puis multipliez-les, comment/pourquoi cela se traduit-il par une chaîne? – gideon
Je ne multiplie pas les nombres. Le 'x' est l'opérateur de réplication de chaîne. –
oh je vois. Merci! :) Perl a beaucoup d'opérateurs. – gideon
Google m'amène ici en cherchant sur la même question posée par phill (le tri des flotteurs) donc je me suis dit que ça valait la peine d'afficher la réponse malgré le fait que le fil soit un peu vieux. Je suis nouveau à perl et je suis toujours en train d'en prendre la tête, mais la déclaration de brian d foy "Perl se soucie plus des verbes que des noms." ci-dessus frappe vraiment le clou sur la tête. Vous n'avez pas besoin de convertir les chaînes en floats avant d'appliquer le tri. Vous devez indiquer au tri de trier les valeurs sous forme de nombres et non de chaînes. -à-dire
my @foo = ('1.2', '3.4', '2.1', '4.6');
my @foo_sort = sort {$a <=> $b} @foo;
Voir http://perldoc.perl.org/functions/sort.html pour plus de détails sur Trier
Si je comprends bien int() ne prétend pas être une fonction « jeté » pour désigner le type de données, il est tout simplement être (ab) utilisé ici pour définir le contexte comme un arithmétique. J'ai (ab) utilisé (0 + $ val) dans le passé pour m'assurer que $ val est traité comme un nombre.
Cette solution est simple:
Exemple 1
my $var1 = "123abc";
print $var1 + 0;
Résultat
123
Exemple 2
my $var2 = "abc123";
print $var2 + 0;
Résultat
0
AFAIU c'est la seule réponse à ce qui a été demandé – Cougar
@Cougar: Je suis d'accord. –
Méfiez-vous lors de l'ajout de zéro à une chaîne. Si la chaîne commence par "inf" ou avec "nan", la valeur ne sera pas nulle. E.g. my $ var2 = "info123"; print $ var2 + 0: Le résultat sera: Inf –
Dans les comparaisons, cela fait une différence si un scalaire est le numéro d'une chaîne. Et ce n'est pas toujours décidable.Je peux signaler un cas où perl récupéré un flotteur en notation « scientifique » et a utilisé cette même quelques lignes ci-dessous dans une comparaison:
use strict;
....
next unless $line =~ /and your result is:\s*(.*)/;
my $val = $1;
if ($val < 0.001) {
print "this is small\n";
}
Et ici $val
n'a pas été interprété comme numérique pour exemple "2e-77"
récupéré à partir de $line
. L'ajout de 0 (ou 0.0 pour de bons programmeurs ole C) a aidé.
$var += 0
probablement ce que vous voulez. Soyez averti cependant, si var $ est une chaîne ne peut pas être converti en numérique, vous aurez l'erreur, et $ var sera remise à 0:
my $var = 'abc123';
print "var = $var\n";
$var += 0;
print "var = $var\n";
journaux
var = abc123
Argument "abc123" isn't numeric in addition (+) at test.pl line 7.
var = 0
Perl est faiblement typé et basé sur le contexte. De nombreux scalaires peuvent être traités à la fois comme des chaînes et des nombres, en fonction des opérateurs que vous utilisez. $a = 7*6; $b = 7x6; print "$a $b\n";
Vous obtenez 42 777777
.
Il existe cependant une différence subtile. Lorsque vous lisez des données numériques à partir d'un fichier texte dans une structure de données, puis l'affichez avec Data::Dumper
, vous remarquerez que vos numéros sont indiqués. Perl les traite en interne comme des chaînes.
Lire: $my_hash{$1} = $2 if /(.+)=(.+)\n/;
.
Dump: 'foo' => '42'
Si vous souhaitez que les numéros non cotés dans la décharge:
Lire: $my_hash{$1} = $2+0 if /(.+)=(.+)\n/;
.
Dump: 'foo' => 42
Après $2+0
Perl remarque que vous avez traité 2 $ en nombre, parce que vous avez utilisé un opérateur numérique.
Je l'ai remarqué en essayant de comparer deux hachages avec Data::Dumper
.
Certaines réponses sont déroutantes car la question a été modifiée. La réponse de Porquero est la meilleure pour cette version de la question. – TimK
La question nécessite plus de détails. La chaîne est-elle composée uniquement de chiffres? Alphanumérique? Ok si les alphas sont dépouillés? Y a-t-il un but spécifique pour le nombre résultant? – JGurtz