我需要将一个 27 位数字拆分成 5 位数字的组。我已经看过了siunitx
、telprint
和numprint
。但是这些只允许我生成两位或三位数字的组。有没有已知的方法可以将数字拆分成 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}