Разделить телефонные номера на группы по первой цифре

Разделить телефонные номера на группы по первой цифре

Проблема

Я пытаюсь разделить некоторые числа на основе некоторых очень простых критериев. Числа с8 цифрами, начинающимися с4,8или9следует разбить на группы цифр длиной 3 2 3.

Любую другую цифру длиной 8 следует разбить на группы по две.

Числа, содержащие менее 8 цифр, не следует разбивать на группы.

Примеры

  • 23 27 60 11 (жесткие пробелы)
  • 404 43 033 (жесткие пробелы, 3 2 3)
  • 820 43 033 (жесткие пробелы, 3 2 3)
  • 909 64 159 (с жесткими пробелами)
  • 07979 (без пробелов)
  • 110 (без пробелов), 112 (без пробелов), 113 (без пробелов)

Извините за отсутствие MWE, но я не совсем уверен, с чего начать.

решение1

Это можно сделать с помощью xstringпакета, который предоставляет команды для извлечения и сравнения подстрок.

Можно выполнить некоторую предварительную обработку строки перед применением форматирования, например, удалить пробелы. Команды xstringдля извлечения подстрок, модификаций и подсчетов имеют общий синтаксис \Command{arg1}{...}[\result], где необязательный \resultаргумент сохраняет результат для дальнейшей обработки (если этот аргумент не указан, результат просто выводится напрямую). Это можно использовать для предварительной обработки, чтобы сохранить предварительно обработанную строку и выполнить остальную обработку строки результата.

МВЭ:

\documentclass{article}
\newif\ifstartnum
\usepackage{xstring}
\newcommand{\splitdigits}[1]{%
\StrDel{#1}{ }[\newstring]%
\StrLen{\newstring}[\mylen]%
\ifnum \mylen=8 %
\startnumfalse%
\IfBeginWith{\newstring}{4}{\startnumtrue}{}%
\IfBeginWith{\newstring}{8}{\startnumtrue}{}%
\IfBeginWith{\newstring}{9}{\startnumtrue}{}%
\ifstartnum%
\StrLeft{\newstring}{3}\ \StrMid{\newstring}{4}{5}\ \StrRight{\newstring}{3}%
\else%
\StrLeft{\newstring}{2}\ \StrMid{\newstring}{3}{4}\ \StrMid{\newstring}{5}{6}\ \StrRight{\newstring}{2}%
\fi%
\else%
#1%
\fi%
}
\begin{document}
\noindent\splitdigits{23276011}\\
\splitdigits{40443033}\\
\splitdigits{82043033}\\
\splitdigits{90964159}\\
\splitdigits{07979}\\
\splitdigits{110} \splitdigits{112} \splitdigits{113}\\
\splitdigits{9 09 6415 9}\\
\splitdigits{90 96 41 59}\\
\splitdigits{232 76 011}
\end{document}

Результат:

введите описание изображения здесь

решение2

Разветвление в соответствии с длиной аргумента: если он состоит из восьми цифр, разветвление выполняется относительно первой цифры; в противном случае выводится аргумент.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\phone}{m}
 {
  \nebu_phone:n { #1 }
 }

\cs_new:Nn \nebu_phone:n
 {
  \int_compare:nTF { \tl_count:n { #1 } = 8 }
   {
    \__nebu_phone_eight:n { #1 }
   }
   {
    #1
   }
 }

\cs_new:Nn \__nebu_phone_eight:n
 {
  \str_case_e:nnF { \tl_head:n { #1 } }
   {
    {4}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
    {8}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
    {9}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
   }
   {
    \__nebu_phone_ii:nnnnnnnn #1
   }
 }

\cs_new:Nn \__nebu_phone_iii_ii_iii:nnnnnnnn { #1#2#3\nobreakspace#4#5\nobreakspace#6#7#8 }
\cs_new:Nn \__nebu_phone_ii:nnnnnnnn { #1#2\nobreakspace#3#4\nobreakspace#5#6\nobreakspace#7#8 }

\ExplSyntaxOff

\begin{document}

\phone{23276011}

\phone{40443033}

\phone{82043033}

\phone{90964159}

\phone{07979}

\phone{110}, \phone{112}, \phone{113}

\end{document}

введите описание изображения здесь

Если вы хотите удалить пробелы из входных данных, вам придется отказаться от расширяемости:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\phone}{m}
 {
  \nebu_phone:n { #1 }
 }

\tl_new:N \l__nebu_phone_tl

\cs_new_protected:Nn \nebu_phone:n
 {
  \tl_set:Nn \l__nebu_phone_tl { #1 }
  \tl_remove_all:Nn \l__nebu_phone_tl { ~ }
  \int_compare:nTF { \tl_count:N \l__nebu_phone_tl = 8 }
   {
    \__nebu_phone_eight:V \l__nebu_phone_tl
   }
   {
    \tl_use:N \l__nebu_phone_tl
   }
 }

\cs_new:Nn \__nebu_phone_eight:n
 {
  \str_case_e:nnF { \tl_head:n { #1 } }
   {
    {4}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
    {8}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
    {9}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
   }
   {
    \__nebu_phone_ii:nnnnnnnn #1
   }
 }
\cs_generate_variant:Nn \__nebu_phone_eight:n { V }

\cs_new:Nn \__nebu_phone_iii_ii_iii:nnnnnnnn { #1#2#3\nobreakspace#4#5\nobreakspace#6#7#8 }
\cs_new:Nn \__nebu_phone_ii:nnnnnnnn { #1#2\nobreakspace#3#4\nobreakspace#5#6\nobreakspace#7#8 }

\ExplSyntaxOff

\begin{document}

\phone{232 76 011}

\phone{40 44 30 33}

\phone{820 430 33}

\phone{90964159}

\phone{079 79}

\phone{110}, \phone{112}, \phone{113}

\end{document}

Результат тот же.

Связанный контент