如何将大数字分成五位数字的组?

如何将大数字分成五位数字的组?

我需要将一个 27 位数字拆分成 5 位数字的组。我已经看过了siunitxtelprintnumprint。但是这些只允许我生成两位或三位数字的组。有没有已知的方法可以将数字拆分成 5 位数字的组?

答案1

从右侧分组:

\documentclass[a4paper]{article}
\usepackage{xstring}

\makeatletter
% Low level macro
% #1 String to separate in groups of five
% #2 Character to insert as separator
\def\@separatefivedigits#1#2{%
  \StrLen{#1}[\length]%
  \ifnum\length<5\relax#1\else%
     \bgroup
     \StrRight{#1}{5}[\lowerfive]%
     \StrGobbleRight{#1}{5}[\remaining]%
     \@separatefivedigits{\remaining}{#2}#2\lowerfive%
     \egroup
  \fi}

% User macro
% #1 String to separate in groups of five
% #2 Character to insert as separator
\def\formatnumber#1#2{\StrDel{#1}{ }[\aux]%
\@separatefivedigits{\aux}{#2}%
}

% Convenience macro for the case in which the separator is the space
\def\formatnumberwithspaces#1{\formatnumber{#1}{ }}
\makeatother

\begin{document}
% Examples
\formatnumberwithspaces{1001234512345123451234512345123451234512345}\par
\formatnumber{1001234512345123451234512345123451234512345}{$\cdot$}
\end{document}

生产

结果

答案2

从左侧分组:

\documentclass{article}
\makeatletter
\newcount\c@Digits
\def\GroupDigits#1{%
  \global\c@Digits=0
  \expandafter\GroupDigits@i#1\@nil}
\def\GroupDigits@i#1#2\@nil{%
  #1%
  \advance\c@Digits by \@ne
  \ifnum\c@Digits=5 \,\c@Digits=\z@\fi
  \ifx\relax#2\relax\else\GroupDigits@i#2\@nil\fi
}
\makeatother
\begin{document}
\GroupDigits{123456789}

\GroupDigits{123456789012345678901234567}
\end{document}

在此处输入图片描述

答案3

在此处输入图片描述

只需comma.sty从 ctan 中取出并更改#1#2#3#1#2#3#4#5

\documentclass{article}

\makeatletter

%%% comma.sty 
%%%
%%% Copyright 1996 1997 David Carlisle
%%%
%%% This file may be distributed under the terms of the LPPL.
%%% See 00readme.txt for details.
%%%
%%% David Carlisle [email protected]
%%%
%\ProvidesPackage{comma}
%      [1997/12/15 v1.2 Insert commas every three digits (DPC)]

%% This package provides a means of producing numbers with a separator
%% (by default a comma) every three digits.
%%
%% Given a LaTeX counter (eg section)
%%
%% \renewcommand\thesection{\commaform{section}}
%%
%% If section is 12345, \thesection will now print as 12,345
%% 
%% If you want something other than a comma, for instance a thin
%% space, or a full word space, redefine \commaformtoken, for instance
%% \renewcommand\commaformtoken{\,}
%% \renewcommand\commaformtoken{ }
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% v1.0 1996/09/05
% v1.1 1997/07/10
% v1.2 1997/12/15


% #1 is the name of a LaTeX counter.
\def\commaform#1{%
  \expandafter\@commaform\csname c@#1\endcsname}

%     The token to place every three digits.
\def\commaformtoken{,}

% Internal version.
% #1 is the number. It may be a TeX count register, eg \count@
%    or an explicit number such as `1234'.
% v1.1 use \relax not empty so explicit digits need not end with a space
% token.
% (This \relax will be eaten by the parser, second two must be \@empty)
% v1.2 add \@comma@ux for very long digit strings (requested on c.t.t)
\def\@commaform#1{%
  \expandafter\@commaaux
    \expandafter{\expandafter}%
    \number\@comma@ux#1%
    \relax\@empty\@empty\@empty\@empty}


% If \@commaform is given a very long digit string then it may be
% too large for \number, so make sure \number only applies to the first
% token. This may leave a spurious space token, but it will be eaten
% by the \@commaaux parsing, which uses non delimited arguments, and
% so skips space tokens.
% Added in v1.2.
\def\@comma@ux#1{#1 }

% Wander down to the end of the number and then see where
%    \relax turns up.
% #1 List of digits already seen (initially {} )
% #2#3#4 next three digits (or \@empty) in list.
\def\@commaaux#1#2#3#4#5#6{%
  \ifx\relax#2%
    \addcomma#1\relax
  \else\ifx\relax#3%
      \addcomma\@empty\@empty\@empty\@empty#1#2\relax
    \else\ifx\relax#4%
      \addcomma\@empty\@empty\@empty#1#2#3\relax
    \else\ifx\relax#5%
      \addcomma\@empty\@empty#1#2#3#4\relax
    \else\ifx\relax#6%
        \addcomma\@empty#1#2#3#4#5\relax
    \else\@commaauxafterfi{#1#2#3#4#5#6}%
      \fi
    \fi
    \fi
    \fi
  \fi}


% Get out of the nested \if before recursing down the list of digits.
% #1 list of digits seen so far.
\def\@commaauxafterfi#1\fi\fi\fi\fi\fi{%
  \fi\fi\fi\fi\fi\@commaaux{#1}}

% Go down adding a `comma' every three tokens. The list will have
%    been padded with 0 1 or 2  \@empty at the start so there is
%    definitely a multiple of three tokens before the \relax.
% #1#2#3 are next three digits
% #4 is next digit, or \relax to stop
\def\addcomma#1#2#3#4#5#6{%
  #1#2#3#4#5%
  \if#6\relax
  \else
    \commaformtoken
    \expandafter\addcomma\expandafter#6%
  \fi}


\let\xcommaform\@commaform

\makeatletter

\begin{document}



\xcommaform{1}

\xcommaform{123}

\xcommaform{12345}

\xcommaform{1234567}

\xcommaform{11111222223333344444}

\xcommaform{11122222333334444455555}

\end{document}

相关内容