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

How to check if string contains an int or float value f#

我只是想要一个函数或方法来检查字符串是否包含数字 0-9。下面的代码是我从另一个线程中找到的,但是当我使用字符串“1”进行测试时,输出仍然是错误的。

let numbercheck x = box x :? int

检查数字是否在字符串内部的一种简单方法是使用正则表达式:

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

此正则表达式取自答案

这是有区别的,当你只想知道字符串是否包含数字或者你想对数值做些什么时。

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

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

正则表达式取自之前的答案

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

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

有几种选择:

open System

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

(无需计算 isDouble 的更高效版本留作 reader 的练习)

open System

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

(更改为 Seq.exists 以检测其他字符中的数字)或正则表达式(参见其他答案)…