F#检查一个字符串是否只包含数字
问题描述:
我想弄清楚一个很好的方法来检查一个字符串是否只包含数字。这是我努力的结果,但它似乎非常啰嗦: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列表,然后返回一个字符串转换。 你能想出更好的解决方案吗?
答
有几种不同的方法来解决这个问题。
鉴于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
值。
这是功课吗?无论如何,我会使用'Seq.forall'。 – kvb
哇,好吧,让我们说这是作业,但实际上我只是从C#切换。 Seq.forall(fun elem - > isDigit elem)“12345”这个工作也好,它更好 – Zeta
你可以缩短到'Seq.forall Char.IsDigit“12345”'而不需要中间的'isDigit'功能 –