F#检查字符串是否只包含数字

时间:2017-02-15 15:17:48

标签: f# pattern-matching

我试图找出一种很好的方法来检查一个字符串是否只包含数字。这是我努力的结果,但看起来真的很冗长:

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

例如,我必须将字符串转换为字符列表然后再转换为字符串,这似乎非常难看。 你能找到更好的解决方案吗?

1 个答案:

答案 0 :(得分:5)

有一些不同的方法可以解决这个问题。

鉴于System.String是一系列字符,您目前正在使用这些字符转换为列表,您可以跳过列表转换,只需使用Seq.forall直接测试:

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

如果您想查看它是否是有效号码,可以直接将其解析为数字:

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

请注意,对于"-342"(包含-,但是有效数字)这样的内容,它也会返回true。

另一种方法是使用正则表达式:

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