Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 29.10.2017
Сообщений: 15

Использование библиотеки Parsec, для форматирования списка телефонных номеров

13.01.2018, 17:28. Показов 1028. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нижеприведенный код необходимо реализовать с использованием библиотеки Parsec


Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
data Result a = Ok a | Error String deriving (Show, Eq)
 
errorInvalidFormat s = Error $ "Invalid phone number format: " ++ s
 
normalizePhoneNumber :: String -> Result String
normalizePhoneNumber n = case n of
    (    '8':num) -> check10 num n
    ('+':'7':num) -> check10 num n
    _             -> check7 n
    _              -> errorInvalidFormat n
    where
        check10 num orig
            | length num == 10  =  Ok ("+7" ++ num)
            | otherwise         =  errorInvalidFormat n
        check7 num
            | length num == 7   =  Ok ("+7343" ++ num)
            | otherwise         =  errorInvalidFormat n
 
normalizePhoneNumbers :: [String] -> ([String], [String])
normalizePhoneNumbers = foldl merge ([], []) . map normalizePhoneNumber
    where
        merge (oks, errors) (Ok    num) = (num:oks, errors)
        merge (oks, errors) (Error err) = (oks, err:errors)
 
testPhoneNumbers =
    [ "89006508005"
    , "9119990868"
    , "+79997109088"
    , "89015572218"
    , "89250475333"
    , "77717793929"
    , "+74973273032"
    , "8921134454454454"
    , "8900650800"
    ,"+791111123"
    , "2492996"
    ]
 
main = let (numbers, errors) = normalizePhoneNumbers testPhoneNumbers in do
    mapM_ putStrLn numbers
    putStrLn ""
    putStrLn "ERRORS:"
    mapM_ putStrLn errors
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2018, 17:28
Ответы с готовыми решениями:

Форматирование списка телефонных номеров
Имеется некий список телефонных номеров, необходимо привести их к общему виду для региона: +7хххххххххх; Если в номере телефона больше...

Regex для украинских телефонных номеров
Привет форумчане.Помогите пожалуйста с настройкой диапазона regex под укр номера. 039;050;063;066;069;067;068;093;095;099;096;097;098.Или...

Составить регулярное выражение для поиска телефонных номеров
всем привет, можно ли как то одной регуляркой искать строки такого вида: +0 000 00-0-0, (000) 00-000-0, +0 (00) 00-00-00 и 000 - 00 - 000...

1
 Аватар для Araneo
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
28.01.2018, 23:47
Так как автор темы сюда больше не заглянет (ибо сроки сдачи, скорее всего, давно прошли, ага), то позволю себе выложить сюда пример решения этой задачки... может тем, кто как и я когда-то искал примеры использования этой чудесной библиотеки будет полезно.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
{-# Language OverloadedStrings #-}
module Lib (someFunc) where
 
import Data.DoList (DoList, fromList, toList)
import Control.Monad
import Text.Parsec
import Data.Monoid
 
someFunc :: IO ()
someFunc = do
    forM_ testPhoneNumbers $ \number -> do
        print $ parse phoneNumber "Number: " number
 
phoneNumber :: Parsec String u String
phoneNumber = plusNum <|> num
 
-- номера начинающиеся на +7
plusNum :: Parsec String u String
plusNum = do
    string "+7" <|> string "8"
    code    <- readCode
    number  <- readNumber
    pure $ "+7" <> code <> number
 
-- остальные номера
num :: Parsec String u String
num = do
    number <- readNumber
    pure $ "+7(343)" <> number
 
 
readCode :: Parsec String u String
readCode = do
    optional $ char '('
    code    <- count 3 digit
    optional $ char ')'
    pure $ "("<> code <> ")"
 
 
readNumber :: Parsec String u String
readNumber = do
    digs1 <- count 3 digit
    optional $ char '-'
    digs2 <- count 2 digit
    optional $ char '-'
    digs3 <- count 2 digit
    pure $ digs1 <> "-" <> digs2 <> "-" <> digs3
 
 
testPhoneNumbers :: [String]
testPhoneNumbers = toList $ do
    "89006508005"
    "9119990868"
    "+7(999)710-90-88"
    "89015572218"
    "89250475333"
    "77717793929"
    "+74973273032"
    "8921134454454454"
    "8900650800"
    "+791111123"
    "2492996"
И весь код целиком в виде проекта... может потом туда ещё примеров накидаю, если лень не будет.
https://github.com/vojiranto/ParsecExemple
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2018, 23:47
Помогаю со студенческими работами здесь

Форматирование телефонных номеров
Всем привет! Помогите с написанием макроса для Excel. Необходимо отформатировать телефонные номера в таблице Excel. Телефонные номера...

Парсинг телефонных номеров
Работаю со специальной телефонной станцией которая выводит префиксы в формате 0079 , также есть локальные номера для страны , которые...

Ввод телефонных номеров списком
Новичок просит помощи, т.к. примеров не нашёл (возможно плохо искал). Итак, вчера написал следующую форму для внесения телефонов (+время...

База данных телефонных номеров
Большая база данных телефонных номеров г. Саратова в Excel 4 столбца. в 4-м адрес. указан как &quot;САРАТОВ 1 АКМОЛИНСКИЙ д.2А...

Программа по обработке телефонных номеров
Моя идея заключается вот в чем: 1Хочу написать (САМ!!) программку, включаешь, открывается программка с 1 полем для ввода номера телефона...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru