如何检查字符串是否包含 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
以检测其他字符中的数字)或正则表达式(参见其他答案)…
我只是想要一个函数或方法来检查字符串是否包含数字 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
以检测其他字符中的数字)或正则表达式(参见其他答案)…