Validate International Securities Identification Number: Difference between revisions
Validate International Securities Identification Number (view source)
Revision as of 17:35, 30 May 2017
, 7 years ago→{{header|Haskell}}: added missing test case to 1st version (+ minor linting)
(→{{header|Haskell}}: Added alternative approach) |
(→{{header|Haskell}}: added missing test case to 1st version (+ minor linting)) |
||
Line 826:
=={{header|Haskell}}==
<lang Haskell>module ISINVerification2 where
where▼
import Data.Char (
verifyISIN :: String -> Bool
verifyISIN isin =
correctFormat isin && mod (oddsum + multiplied_even_sum) 10 == 0
multiplied_even_sum = addUpDigits $ map ((* 2) . digitToInt) theEvens
capitalLetters ::
capitalLetters = ['A'
numbers ::
numbers = ['0'
correctFormat :: String -> Bool
correctFormat isin =
(length isin == 12) &&
&& (all (\c -> elem c capitalLetters || elem c numbers) $ drop 2 $ take 11 isin)▼
elem (last isin) numbers
convertToNumber :: String -> String
convertToNumber
convert c =
convert c = if isDigit c then show $ digitToInt c else show ( fromEnum c - 55 )▼
if isDigit c
then show $ digitToInt c
collectOddandEven :: String -> (String , String )▼
collectOddandEven term ▼
|odd $ length term = (concat [take 1 $ drop n term | n <- [0,2..length term - 1]] ,▼
concat [take 1 $ drop d term | d <- [1,3..length term - 2]] )▼
|otherwise = (concat [take 1 $ drop n term | n <- [0,2..length term -2]] ,▼
concat [take 1 $ drop d term | d <- [1,3..length term - 1]] )▼
| odd $ length term =
( concat
[ take 1 $ drop n term
, concat
[ take 1 $ drop d term
| otherwise =
( concat
[ take 1 $ drop n term
, concat
[ take 1 $ drop d term
addUpDigits :: [Int] -> Int
addUpDigits list =
addUpDigits list = sum $ map (\d -> if d > 9 then sum $ map digitToInt $ show d else d ) list▼
▲ sum $
map
(\d ->
if d > 9
else d)
list
printSolution :: String -> IO (
printSolution str = do
then putStrLn " valid"
else putStrLn " not valid"
main :: IO (
main = do
[ "US0378331005"
"AU0000VXGZA3" , "FR0000988040"]▼
, "US0373831005"
mapM_ printSolution isinnumbers</lang> ▼
, "U50378331005"
, "US03378331005"
, "AU0000XVGZA3"
, "AU0000VXGZA3"
]
{{out}}
<pre>US0378331005 is valid
US0373831005 is not valid
U50378331005 is not valid
US03378331005 is not valid
AU0000XVGZA3 is valid
AU0000VXGZA3 is valid
FR0000988040 is valid</pre>
Or, making alternative choices from standard libraries:
Line 914 ⟶ 945:
(show =<<) . fromMaybe [] . sequence . fmap (`M.lookup` charMap)
capitals, digits :: String
capitals = ['A' .. 'Z']
digits = ['0' .. '9']
|