7

如何在 Perl 中将字符串转换为数字?

例子:

$str = '10.0500000';
$number = $str * 1;  # 10.05

是否有另一种标准方法可以从 '10.0500000' 获得 10.05 而不是乘以 1?

4

4 回答 4

11

编辑 2020:答案是错误的,请参阅下面的评论。我无权删除已接受的答案。


我正在回答字面问题。也许您想格式化数字以供显示。

两种表达方式

sprintf '%.2f', '10.0500000'
sprintf '%.2f', 10.0500000

返回字符串10.05

于 2012-05-14T12:41:51.010 回答
9

在 Perl 中,标量没有类型。相反,运营商是。因此,当您$a . "1"使用时,您将$a其用作字符串,而当您$a + 1使用时,则将$a其用作数字。Perl 将尽最大努力弄清楚标量对于给定操作的含义。因此,在大多数情况下,“转换”是为您隐式完成的。

如果您需要验证您的字符串确实可以转换,请使用正则表达式。

这是关于如何做到这一点的一篇论述:http ://www.regular-expressions.info/floatingpoint.html

于 2012-05-14T12:32:28.177 回答
6

好吧,您也可以添加 0 :-)

你不应该太在意 Perl 中标量的内部表示,除非你在做一些奇怪的事情(如果你在做,请告诉我们)。任何看起来像数字的东西都是数字。

还是您需要检查字符串是否为“真实”数字?好吧,实际上,任何字符串都是。有一篇不错的文章Is it a Number on this topic。该链接指向Wayback Machine,因为原件已从perl.com.

于 2012-05-14T12:30:57.890 回答
3

0+有点惯用语。它通常用于区分对偶变量的组件。

$ perl -E'
   system({ "nonexistant" } "nonexistant");
   say 0+$!, ": ", $!;
'
2: No such file or directory

这看起来很奇怪,因为这不是您通常必须做的事情。数字是一个数字,无论它在内部存储为 PV、IV、UV 还是 NV。没有必要强制将其存储为 NV(浮点数),并且通常表明其他地方的设计存在错误。

于 2012-05-14T15:40:37.693 回答