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 xstring
paquete, 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 xstring
comandos para extraer subcadenas, modificaciones y recuentos tienen una sintaxis general \Command{arg1}{...}[\result]
donde el argumento opcional \result
almacena 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:
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}
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.