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

时间:2015-05-04 11:29:24

标签: validation haskell

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

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

isNumber :: String -> Bool
isNumber xs = all isDigit xs || add extra code here

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

number -> .digit+ | digit+ [ .digit*]

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

3 个答案:

答案 0 :(得分:9)

一种简单的方法是使用readMaybe将字符串转换为数字

import Text.Read

以便检查它是否为Double

readMaybe "123" :: Maybe Double
Just 123.0

readMaybe "12a3" :: Maybe Double
Nothing

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

readMaybe "12.3" :: Maybe Int
Nothing

答案 1 :(得分:8)

这是一个简单的策略:

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

    a)空字符串,或

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

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

    翻译成Haskell:

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

答案 2 :(得分:3)

看看reads,然后:

isNumber :: String -> Bool
isNumber str =
    case (reads str) :: [(Double, String)] of
      [(_, "")] -> True
      _         -> False

但也许有更好的方法。

请注意,对于在Haskell中被视为有效的数字,这将返回True,您的特定用例未完全覆盖。如果您需要根据您的规范进行自定义解析,您应该使用像Parsec这样的东西,正如@CarstenKönig在他的评论中所建议的那样。