我试图找出一种很好的方法来检查一个字符串是否只包含数字。这是我努力的结果,但看起来真的很冗长:
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
例如,我必须将字符串转换为字符列表然后再转换为字符串,这似乎非常难看。 你能找到更好的解决方案吗?
答案 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
。