Haskell:检查字符串是否为有效数字

Zas*_*ast 8 validation haskell

检查字符串是有效数字时如何检查小数点?

我在想的是我使用类似下面的内容,但添加代码来检查小数点!

isNumber :: String -> Bool
isNumber xs = all isDigit xs || add extra code here
Run Code Online (Sandbox Code Playgroud)

如果有效数字在EBNF中定义为:

number -> .digit+ | digit+ [ .digit*]
Run Code Online (Sandbox Code Playgroud)

例如,.5,1.5,1,1都是有效数字.+表示一次或多次出现,*表示零或更多.

elm*_*elm 9

一种简单的方法涉及readMaybe用于将字符串转换为数字,

import Text.Read
Run Code Online (Sandbox Code Playgroud)

因此,为了检查它是否是Double,

readMaybe "123" :: Maybe Double
Just 123.0

readMaybe "12a3" :: Maybe Double
Nothing
Run Code Online (Sandbox Code Playgroud)

后者返回Nothing,字符串不是有效数字.以类似的方式,如果我们假设它是一个Int,

readMaybe "12.3" :: Maybe Int
Nothing
Run Code Online (Sandbox Code Playgroud)


ham*_*mar 8

这是一个简单的策略:

  1. 剥掉字符串开头的所有数字.
  2. 剩下的字符串现在应该是

    a)空字符串,或

    b)小数点后跟所有数字.

好吧,差不多.这也会匹配空字符串"","."但我们可以将它们视为特殊情况.

翻译成Haskell:

isNumber :: String -> Bool
isNumber ""  = False
isNumber "." = False
isNumber xs  =
  case dropWhile isDigit xs of
    ""       -> True
    ('.':ys) -> all isDigit ys
    _        -> False
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 3

看看reads,然后:

\n\n
isNumber :: String -> Bool\nisNumber str =\n    case (reads str) :: [(Double, String)] of\n      [(_, "")] -> True\n      _         -> False\n
Run Code Online (Sandbox Code Playgroud)\n\n

不过,也许还有更好的方法。

\n\n

请注意,这将返回TrueHaskell 中被视为有效的数字,但您的特定用例并未完全涵盖于此。如果您需要根据您的规范进行自定义解析,您应该使用 Parsec 之类的东西,正如 @CarstenK\xc3\xb6nig 在他的评论中建议的那样。

\n