첫 번째 숫자를 기준으로 전화번호를 그룹으로 분할

첫 번째 숫자를 기준으로 전화번호를 그룹으로 분할

문제

매우 간단한 기준에 따라 일부 숫자를 분할하려고 합니다. 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

MWE:

\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

인수의 길이에 따라 분기합니다. 길이가 8자리이면 첫 번째 숫자를 기준으로 분기합니다. 그렇지 않으면 인수를 인쇄합니다.

\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}

출력은 동일합니다.

관련 정보