如何检查字符串是否包含int或float值f#



我只是想要一个函数或方法来检查一个字符串是否包含数字0-9。下面的代码是我从另一个线程中发现的,但是当我测试字符串"1"输出仍然为假

let numbercheck x = box x :? int

有几个选项:

open System
let numbercheck (candidate : string) =
let isInt, _ = Int32.TryParse candidate
let isDouble, _ = Double.TryParse candidate
isInt || isDouble

(不需要计算isDouble的更有效的版本留给读者作为练习)

open System
let numbercheck (candidate : string) =
candidate |> Seq.forall Char.IsDigit

(更改为Seq.exists以检测其他字符中的数字)或regex(见其他答案)…

检查number是否在string中一个简单的方法是使用正则表达式:

open System.Text.RegularExpressions
let containsNumber str =
Regex.IsMatch(str, @"[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)")
containsNumber "123" |> printfn "%b" // true
containsNumber "asd" |> printfn "%b" // false
containsNumber "asd123" |> printfn "%b" // true
containsNumber "asd123." |> printfn "%b" // true
containsNumber "asd123.0" |> printfn "%b" // true
containsNumber "a123.0sd" |> printfn "%b" // true

这个正则表达式取自答案https://stackoverflow.com/a/12643073/10339675

当您只想知道字符串是否包含数字或您想对数字值进行操作时,这是有区别的。

如果您只想检查字符串是否包含数字:

open System.Text.RegularExpressions
let containsNumber (string: string) =
match string |> Int32.TryParse with
| true, _int -> true                   // this will parse a string if it contains just an int value
| _ ->
match string |> Double.TryParse with   // this will parse a string if it contains just an float value
| true, _float -> true
| _ -> Regex.IsMatch(string, @"[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)") // this will check, if the string contains numbers (amongst other characters)
containsNumber "" |> printfn "%b"          // false - by regex match
containsNumber "123" |> printfn "%b"       // true - by int parse
containsNumber "13.37" |> printfn "%b"     // true - by float parse
containsNumber "ab12cd" |> printfn "%b"    // true - by regex match
containsNumber "ab12.3cd" |> printfn "%b"  // true - by regex match
containsNumber "1a2b3c" |> printfn "%b"    // true - by regex match

正则表达式取自之前的答案https://stackoverflow.com/a/72166297/19068406

如果您想实际使用已解析的值,对于正则表达式的情况可能会稍微复杂一些,但是使用第一个和第二个选项相当容易,因为您只使用已解析的值。

type IntOrFloat =
| Int of int
| Float of float
let containsIntOrFloat (string: string) =
match string |> Int32.TryParse with
| true, int -> Some (Int int)
| _ ->
match string |> Double.TryParse with
| true, float -> Some (Float float)
| _ -> None
containsIntOrFloat "" |> printfn "%A"         // None
containsIntOrFloat "123" |> printfn "%A"      // Some (Int 123)
containsIntOrFloat "13.37" |> printfn "%A"    // Some (Float 13.37)
containsIntOrFloat "ab12cd" |> printfn "%A"   // None
containsIntOrFloat "ab12.3cd" |> printfn "%A" // None
containsIntOrFloat "1a2b3c" |> printfn "%A"   // None

最新更新