如何在检查字符串是否为有效数字时检查小数点?
我想的是使用以下代码,但需要添加代码来检查小数点!
isNumber :: String -> Bool
isNumber xs = all isDigit xs || add extra code here
在EBNF中,有效数字被定义为:
number -> .digit+ | digit+ [ .digit*]
例如,.5,1.5,1,1. 都是有效的数字。+表示一个或多个出现,而*表示零个或多个。如何在检查字符串是否为有效数字时检查小数点?
我想的是使用以下代码,但需要添加代码来检查小数点!
isNumber :: String -> Bool
isNumber xs = all isDigit xs || add extra code here
在EBNF中,有效数字被定义为:
number -> .digit+ | digit+ [ .digit*]
例如,.5,1.5,1,1. 都是有效的数字。+表示一个或多个出现,而*表示零个或多个。一个简单的方法涉及使用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
isNumber :: String -> Bool
isNumber "" = False
isNumber "." = False
isNumber xs =
case dropWhile isDigit xs of
"" -> True
('.':ys) -> all isDigit ys
_ -> False
请查看reads
函数,然后:
isNumber :: String -> Bool
isNumber str =
case (reads str) :: [(Double, String)] of
[(_, "")] -> True
_ -> False
isNumber "1.0."
(甚至是 1.xxx
)也是 True
- 这是有效的吗? - Random Dev"1."
或 ".5"
吧 ;) (我想要的只是让你根据规格测试你的代码 :P - 它可能并不像看起来那么简单 - 但也许 OP 对此很满意) - Random Dev
parsec
(或类似的工具)来完成这个任务。 - Random Dev