检查字符串是否为有效数字时,如何检查小数点?
我在想的是我使用类似下面的内容,但添加代码来检查小数点!
isNumber :: String -> Bool
isNumber xs = all isDigit xs || add extra code here
如果在EBNF中将有效数字定义为:
number -> .digit+ | digit+ [ .digit*]
例如,.5,1.5,1,1都是有效数字。 + 表示一次或多次出现,*表示零或更多。
答案 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)
这是一个简单的策略:
剩下的字符串现在应该是
a)空字符串,或
b)小数点后跟所有数字。
""
和"."
,但我们可以将其视为特殊情况。
翻译成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在他的评论中所建议的那样。