我想将像 31556952000 这样的大数字格式化为 31,556,952,000,并使用千位分隔符。\usepackage[group-separator={,}]{siunitx}
在序言和\num{31556952000}
正文中添加效果很好,但不适合 ACM TAPS 提交,因为siunitx
没有已批准的包裹清单。 作为使用 siunitx 保留千位分隔符,这是强加的要求。
如何仅使用 ACM TAPS 支持的包来获取以逗号分隔的千位?
答案1
取出核心循环siunitx
并写出,我们会得到类似
\documentclass{article}
\makeatletter
\providecommand*\num[2][]{%
\ensuremath{%
\num@auxi{0}{}#2\num@q@stop
}%
}
\newcommand\num@auxi{}
\long\def\num@auxi#1#2#3{%
\ifx#3\num@q@stop
\expandafter\num@auxiii
\else
\expandafter\num@auxii
\fi
{#1}{#2}{#3}%
}
\newcommand\num@auxiii[3]{%
\expandafter\num@auxiv\expandafter
{\number\numexpr#1\relax}{#2}%
}
\newcommand\num@auxii[3]{\num@auxi{#1 + 1}{#2#3}}
\newcommand\num@auxiv[2]{%
\@nameuse{num@aux@\number\numexpr#1-(\@num@div#1;3;)*3\relax}{#2}%
}
\long\@namedef{num@aux@0}#1{%
\num@loop@first#1\num@q@stop
}
\long\@namedef{num@aux@1}#1{%
\num@loop@first{}{}#1\num@q@stop
}
\long\@namedef{num@aux@2}#1{%
\num@loop@first{}#1\num@q@stop
}
\newcommand\num@loop@first[4]{%
#1#2#3%
\ifx#4\num@q@stop
\expandafter\@gobble
\else
\expandafter\num@loop
\fi
#4%
}
\newcommand\num@loop[4]{%
\mathord{,}%
#1#2#3%
\ifx#4\num@q@stop
\expandafter\@gobble
\else
\expandafter\num@loop
\fi
#4%
}
\newcommand\@num@div{}
\long\def\@num@div#1#2;#3#4;{%
\ifx0#1%
0%
\else
(#1#2\ifx-#1+\else-\fi(\ifx-#3-\fi#3#4-1)/2)%
\fi /#3#4%
}
\def\nume@q@stop{\nume@q@stop}
\makeatother
\begin{document}
\num{31556952000}
\end{document}