有什么方法可以检查从 readline 输入的字符是数字吗?

Is there any way to check character input from a readline is a number?

我想问问有没有办法检查readline()的结果是否是数字。

由于我需要对这些输入进行数学运算,除了数字和“.”之外的任何字符。会破坏程序。

我是否必须逐个字母地处理输入字符串以检查每个字符?或者有一些优雅的方法来做到这一点?

函数readline()总是return一个字符串。您可以通过两种方式处理此问题:

  • as.numeric() 使用蛮力:这将 return 任何不能转换为数字的东西 NA。然后您可以使用 is.na() 检查是否有效。
  • 使用正则表达式。使用 grepl() 时,向量的每个元素都会得到一个 TRUE/FALSE 值,指示是否已找到某个字符。

尝试以下操作:

x <- readline("give a number: ")
if(grepl("[^[:digit:]\.-]",x)) stop("This is not a number") else "Hooray"

工作方式如下:

> x <- readline("give a number: ")
give a number: -23.48
> if(grepl("[^[:digit:]\.-]",x)) stop("This is not a number") else "Hooray"
[1] "Hooray"
> x <- readline("give a number: ")
give a number: -25.645)
> if(grepl("[^[:digit:]\.-]",x)) stop("This is not a number") else "Hooray"
Error: This is not a number

如果你想彻底检查某些东西是否被格式化为数字(包括科学记数法),这是一个经典的正则表达式来测试它:

"ˆ[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$"

那就是:

x <- readline("give a number: ")
isnumber <- grepl("ˆ[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$",x)
if(!isnumber) stop("X is not a number") else "Hooray"