Teilen Sie Telefonnummern basierend auf der ersten Ziffer in Gruppen auf

Teilen Sie Telefonnummern basierend auf der ersten Ziffer in Gruppen auf

Problem

Ich versuche, einige Zahlen nach einigen sehr einfachen Kriterien aufzuteilen. Zahlen mit 8Ziffern, die mit beginnen4,8oder9sollte in Zifferngruppen der Länge aufgeteilt werden 3 2 3.

Alle anderen Ziffern der Länge 8 sollten in Zweiergruppen aufgeteilt werden.

Zahlen mit weniger als 8 Ziffern sollten nicht in Gruppen aufgeteilt werden.

Beispiele

  • 23 27 60 11 (harte Leerzeichen)
  • 404 43 033 (harte Leerzeichen, 3 2 3)
  • 820 43 033 (harte Leerzeichen, 3 2 3)
  • 909 64 159 (harte Leerzeichen)
  • 07979 (keine Leerzeichen)
  • 110 (keine Leerzeichen), 112 (keine Leerzeichen), 113 (keine Leerzeichen)

Entschuldigen Sie das Fehlen von MWE, aber ich bin nicht ganz sicher, wo ich anfangen soll.

Antwort1

Dies kann mit dem Paket erfolgen xstring, das Befehle zum Extrahieren und Vergleichen von Teilzeichenfolgen bereitstellt.

Es ist möglich, vor der Formatierung eine Vorverarbeitung der Zeichenfolge durchzuführen, beispielsweise um Leerzeichen zu entfernen. Die xstringBefehle zum Extrahieren von Teilzeichenfolgen, Änderungen und Zählungen haben die allgemeine Syntax, \Command{arg1}{...}[\result]bei der das optionale \resultArgument das Ergebnis zur weiteren Verarbeitung speichert (wenn dieses Argument nicht angegeben wird, wird das Ergebnis einfach direkt gedruckt). Dies kann zur Vorverarbeitung verwendet werden, um die vorverarbeitete Zeichenfolge zu speichern und die restliche Verarbeitung an der Ergebniszeichenfolge vorzunehmen.

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}

Ergebnis:

Bildbeschreibung hier eingeben

Antwort2

Verzweigen Sie entsprechend der Länge des Arguments: Wenn es acht Ziffern lang ist, verzweigen Sie in Bezug auf die erste Ziffer, andernfalls drucken Sie das Argument.

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

Bildbeschreibung hier eingeben

Möchte man Leerzeichen aus der Eingabe entfernen, muss man auf die Erweiterbarkeit verzichten:

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

Die Ausgabe ist die gleiche.

verwandte Informationen