2017-03-16 82 views
1

我想問是否有方法檢查readline()的結果是否是數字。有沒有辦法檢查readline的字符輸入是一個數字?

由於我需要對這些輸入進行數學運算,所以除了數字和「。」以外的任何字符。將摧毀該計劃。

我是否必須逐字逐字檢查每個字符?或者有一些優雅的方式來做到這一點?

+1

的readline的'的值()'是 「長度爲1的字符向量」(引用'readline'?)。你爲什麼不把它包裝在'as.numeric()'中,並使你的程序健壯到'NA'輸入? –

+0

@apom使用as.numeric的問題是,它會默認更改輸入,例如,如果輸入是「2,8」而不是「2.8」,結果將是數字2 –

回答

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" 
+0

正則表達式有一些潛在的漏洞;那麼'13.234.2342「作爲一個測試用例呢......?是'+ 23'的合法號碼嗎? '1.0e23' ...怎麼樣? –

+0

@BenBolker這一切都與第二個正則表達式。 –

相關問題