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都是有效数字.+表示一次或多次出现,*表示零或更多.
一种简单的方法涉及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)
这是一个简单的策略:
剩下的字符串现在应该是
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)
看看reads,然后:
isNumber :: String -> Bool\nisNumber str =\n case (reads str) :: [(Double, String)] of\n [(_, "")] -> True\n _ -> False\nRun Code Online (Sandbox Code Playgroud)\n\n不过,也许还有更好的方法。
\n\n请注意,这将返回TrueHaskell 中被视为有效的数字,但您的特定用例并未完全涵盖于此。如果您需要根据您的规范进行自定义解析,您应该使用 Parsec 之类的东西,正如 @CarstenK\xc3\xb6nig 在他的评论中建议的那样。