有没有办法检查readline中的字符输入是一个数字?

时间:2017-03-16 15:05:06

标签: r regex readline numeric

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

因为我需要对这些输入进行数学运算,除了数字和“。”之外的任何字符。将摧毁该计划。

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

1 个答案:

答案 0 :(得分:1)

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

  • as.numeric()使用暴力:这将返回任何无法转换为数字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"