Divida los números de teléfono en grupos según el primer dígito

Divida los números de teléfono en grupos según el primer dígito

Problema

Estoy intentando dividir algunos números según algunos criterios muy simples. Números con8 dígitos que comienzan con4,8o9debe dividirse en grupos de dígitos de longitud 3 2 3.

Cualquier otro dígito de longitud 8 debe dividirse en grupos de dos.

Los números con menos de 8 dígitos no deben dividirse en grupos.

Ejemplos

  • 23 27 60 11 (espacios duros)
  • 404 43 033 (espacios duros, 3 2 3)
  • 820 43 033 (espacios duros, 3 2 3)
  • 909 64 159 (espacios duros)
  • 07979 (sin espacios)
  • 110 (sin espacios), 112 (sin espacios), 113 (sin espacios)

Perdón por la falta de MWE, pero no estoy muy seguro de por dónde empezar.

Respuesta1

Esto se puede hacer con el xstringpaquete, que proporciona comandos para extraer y comparar subcadenas.

Es posible realizar algún preprocesamiento en la cadena antes de aplicar el formato, por ejemplo, para eliminar espacios en blanco. Los xstringcomandos para extraer subcadenas, modificaciones y recuentos tienen una sintaxis general \Command{arg1}{...}[\result]donde el argumento opcional \resultalmacena el resultado para su posterior procesamiento (si no se proporciona este argumento, el resultado simplemente se imprime directamente). Esto se puede utilizar para el preprocesamiento para almacenar la cadena preprocesada y realizar el resto del procesamiento en la cadena resultante.

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}

Resultado:

ingrese la descripción de la imagen aquí

Respuesta2

Ramifica según la longitud del argumento: si tiene ocho dígitos, ramifica con respecto al primer dígito; de lo contrario, imprima el argumento.

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

ingrese la descripción de la imagen aquí

Si desea eliminar espacios de la entrada, debe renunciar a la capacidad de expansión:

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

La salida es la misma.

información relacionada