有什么方法可以检查从 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"
我想问问有没有办法检查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"