我想問是否有方法檢查readline()
的結果是否是數字。有沒有辦法檢查readline的字符輸入是一個數字?
由於我需要對這些輸入進行數學運算,所以除了數字和「。」以外的任何字符。將摧毀該計劃。
我是否必須逐字逐字檢查每個字符?或者有一些優雅的方式來做到這一點?
我想問是否有方法檢查readline()
的結果是否是數字。有沒有辦法檢查readline的字符輸入是一個數字?
由於我需要對這些輸入進行數學運算,所以除了數字和「。」以外的任何字符。將摧毀該計劃。
我是否必須逐字逐字檢查每個字符?或者有一些優雅的方式來做到這一點?
函數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"
正則表達式有一些潛在的漏洞;那麼'13.234.2342「作爲一個測試用例呢......?是'+ 23'的合法號碼嗎? '1.0e23' ...怎麼樣? –
@BenBolker這一切都與第二個正則表達式。 –
的readline的'的值()'是 「長度爲1的字符向量」(引用'readline'?)。你爲什麼不把它包裝在'as.numeric()'中,並使你的程序健壯到'NA'輸入? –
@apom使用as.numeric的問題是,它會默認更改輸入,例如,如果輸入是「2,8」而不是「2.8」,結果將是數字2 –