98 votes

Comment puis-je convertir une chaîne de caractères en un nombre en Perl ?

J'ai une chaîne qui contient une valeur décimale et je dois convertir cette chaîne en une variable à virgule flottante. Par exemple, la chaîne que j'ai est "5.45" et je veux un équivalent en virgule flottante pour pouvoir y ajouter .1. J'ai fait des recherches sur Internet, mais je ne vois que la façon de convertir une chaîne de caractères en un nombre entier.

0 votes

La question doit être précisée. La chaîne est-elle uniquement composée de chiffres ? Alphanumérique ? Peut-on supprimer les lettres ? Y a-t-il un but spécifique pour le nombre résultant ?

96voto

Alnitak Points 143355

Vous n'avez pas besoin de le convertir du tout :

% perl -e 'print "5.45" + 0.1;'
5.55

15 votes

@OrangeDog le PO a modifié la question (quelques mois après que cette réponse ait été postée) - la question originale contenait en fait des nombres à virgule flottante.

1 votes

Qu'en est-il des comparaisons lorsque la chaîne de caractères contient une virgule ?

0 votes

[rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" unless "1,000" > 10;' nope [rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" if "1,000" > 10;'

78voto

porquero Points 434

C'est une solution simple :

Exemple 1

my $var1 = "123abc";
print $var1 + 0;

Résultat

123

Exemple 2

my $var2 = "abc123";
print $var2 + 0;

Résultat

0

9 votes

AFAIU c'est la seule réponse à ce qui a été demandé.

4 votes

Attention à l'ajout de zéro à une chaîne de caractères. Si la chaîne commence par "inf" ou par "nan", la valeur ne sera pas zéro. Par exemple, my $var2 = "info123" ; print $var2 + 0 : Le résultat sera : Inf

0 votes

Je faisais un foreach my $i ('00'..'15') et a dû supprimer les zéros de tête à certains endroits. Ce site 0+ La coulée vers un numéro permet également d'atteindre cet objectif.

44voto

brian d foy Points 71781

Perl est un langage basé sur le contexte. Il ne fait pas son travail en fonction des données que vous lui fournissez. Au contraire, il trouve 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 sortes de nombres, vous obtenez des nombres :

# numeric addition with strings:
my $sum = '5.45' + '0.01'; # 5.46

Si vous faites des sortes de ficelles, vous obtenez des ficelles :

# string replication with numbers:
my $string = ( 45/2 ) x 4; # "22.522.522.522.5"

Perl trouve la plupart du temps ce qu'il faut faire et c'est la plupart du temps juste. Une autre façon de dire la même chose est que Perl se soucie plus des verbes que des noms.

Vous essayez de faire quelque chose et ça ne marche pas ?

1 votes

Pardonnez mon manque de connaissances, mais je ne comprends pas bien votre deuxième exemple. Tu divises deux nombres, puis tu les multiplies, comment/pourquoi cela donne-t-il une chaîne ?

4 votes

Je ne multiplie pas les chiffres. Le site x est l'opérateur de réplication des chaînes de caractères.

3 votes

Cela ne devrait-il pas être my $string = ( 45/2 ) x 3; # "22.522.522.5" avec 45 au lieu de 44 ? Sinon je ne comprends pas d'où viennent les '.5 dans le résultat...

10voto

Norm Points 78

Google m'a conduit ici alors que je cherchais la même question que celle posée par Phillip (trier les flotteurs). J'ai donc pensé que cela vaudrait la peine de poster la réponse, même si le fil de discussion est un peu vieux. Je suis nouveau dans le monde de Perl et je suis encore en train de me faire une idée, mais la déclaration de Brian D Foy "Perl se soucie plus des verbes que des noms" ci-dessus fait vraiment mouche. Vous n'avez pas besoin de convertir les chaînes de caractères en flottants avant d'appliquer le tri. Vous devez demander au tri de classer les valeurs en tant que nombres et non en tant que chaînes de caractères. Par exemple

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 le tri

9voto

mccutchm Points 41

Comme je le comprends int() n'est pas prévu comme une fonction "cast" pour désigner le type de données, il est simplement (ab)utilisé ici pour définir le contexte comme arithmétique. J'ai (ab)utilisé (0+$val) dans le passé pour m'assurer que $val est traité comme un nombre.

0 votes

oui, int() est "(ab)utilisé" ; compris.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X