2017-02-15 184 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值。

相关问题