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)
例如,我必须将字符串转换为字符列表然后返回字符串似乎真的很难看.你能想出更好的解决方案吗?
有几种不同的方法可以解决此问题。
鉴于这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