2017-02-15 185 views
4

我想弄清楚一個很好的方法來檢查一個字符串是否只包含數字。這是我努力的結果,但它似乎非常囉嗦:F#檢查一個字符串是否只包含數字

let isDigit c = Char.IsDigit c 

let rec strContainsOnlyNumber (s:string)= 
    let charList = List.ofSeq s 
    match charList with 
     | x :: xs -> 
      if isDigit x then 
       strContainsOnlyNumber (String.Concat (Array.ofList xs)) 
      else 
       false 
     | [] -> true 

例如,它似乎真的很醜,我有一個字符串爲char列表,​​然後返回一個字符串轉換。 你能想出更好的解決方案嗎?

+3

這是功課嗎?無論如何,我會使用'Seq.forall'。 – kvb

+1

哇,好吧,讓我們說這是作業,但實際上我只是從C#切換。 Seq.forall(fun elem - > isDigit elem)「12345」這個工作也好,它更好 – Zeta

+8

你可以縮短到'Seq.forall Char.IsDigit「12345」'而不需要中間的'isDigit'功能 –

回答

3

有幾種不同的方法來解決這個問題。

鑑於System.String是字符序列,您目前正在使用變成一個列表,你可以跳過列表的轉換,只需使用Seq.forall直接測試:

let strContainsOnlyNumber (s:string) = s |> Seq.forall Char.IsDigit 

如果你想看它是否是一個有效的數字,你可以解析成一個號碼直接:

let strContainsOnlyNumber (s:string) = System.Int32.TryParse s |> fst 

注意,這也將爲東西返回true像"-342"(其中包含-,但它是一個有效的麻木ER)。

另一種方法是使用正則表達式:

let numberCheck = System.Text.RegularExpressions.Regex("^[0-9]+$")  
let strContainsOnlyNumbers (s:string) = numberCheck.IsMatch s 

這也將處理數字字符,但可以適應如果需要的話,包括在數字其他符號。

如果目標是稍後使用的字符串作爲一個數字,我的建議是,只是做一個轉換,並將其存儲在一個選項:

let tryToInt s = 
    match System.Int32.TryParse s with 
    | true, v -> Some v 
    | false, _ -> None 

這將允許你進行檢查,看是否值是一個數字(通過Option.isSome),模式匹配以使用結果,等等。

請注意,轉換爲浮點數幾乎是相同的 - 只要將Int32.TryParse更改爲Double.TryParse如果您想要處理float值。

相關問題