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

Zet*_*eta 7 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
Run Code Online (Sandbox Code Playgroud)

例如,我必须将字符串转换为字符列表然后返回字符串似乎真的很难看.你能想出更好的解决方案吗?

Ree*_*sey 6

有几种不同的方法可以解决此问题。

鉴于这System.String是一个字符序列,您当前正在使用这些字符将其转换为列表,因此可以跳过列表转换,而仅用于Seq.forall直接测试:

let strContainsOnlyNumber (s:string) = s |> Seq.forall Char.IsDigit
Run Code Online (Sandbox Code Playgroud)

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

let strContainsOnlyNumber (s:string) = System.Int32.TryParse s |> fst
Run Code Online (Sandbox Code Playgroud)

请注意,对于类似"-342"(包含-,但是有效数字)的东西,这也将返回true 。

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

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

这也将处理数字字符,但是如果需要,可以进行修改以在数字中包含其他符号。

如果目标是以后将字符串用作数字,我的建议是只进行转换,然后存储在选项中:

let tryToInt s = 
    match System.Int32.TryParse s with
    | true, v -> Some v
    | false, _ -> None
Run Code Online (Sandbox Code Playgroud)

这将允许您检查值是否为数字(通过Option.isSome),模式匹配以使用结果等。

请注意,到浮点数的转换几乎相同- 如果要处理值,只需将转换Int32.TryParse为a 。Double.TryParsefloat