Problema
Estou tentando dividir alguns números com base em alguns critérios muito simples. Números com 8
algarismos começando com4,8ou9deve ser dividido em grupos de dígitos de comprimento 3 2 3
.
Qualquer outro dígito de comprimento 8 deve ser dividido em grupos de dois.
Números com menos dígitos que 8 não devem ser divididos em grupos.
Exemplos
- 23 27 60 11 (espaços difíceis)
- 404 43 033 (espaços rígidos, 3 2 3)
- 820 43 033 (espaços rígidos, 3 2 3)
- 909 64 159 (espaços rígidos)
- 07979 (sem espaços)
- 110 (sem espaços), 112 (sem espaços), 113 (sem espaços)
Desculpe pela falta de MWE, mas não sei por onde começar.
Responder1
Isso pode ser feito com o xstring
pacote, que fornece comandos para extrair e comparar substrings.
É possível fazer algum pré-processamento na string antes de a formatação ser aplicada, por exemplo, para remover espaços em branco. Os xstring
comandos para extrair substrings, modificações e contagens possuem a sintaxe geral \Command{arg1}{...}[\result]
onde o argumento opcional \result
armazena o resultado para processamento posterior (se este argumento não for fornecido o resultado é apenas impresso diretamente). Isso pode ser usado para pré-processamento para armazenar a sequência pré-processada e fazer o restante do processamento na sequência de resultados.
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:
Responder2
Ramifique de acordo com o comprimento do argumento: se tiver oito dígitos, ramifique em relação ao primeiro dígito; caso contrário, imprima o 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}
Se você quiser remover espaços da entrada, terá que abrir mão da capacidade de expansão:
\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}
A saída é a mesma.