有没有办法在打印时格式化数字字符串?
假设我有以下声明:
\newcommand{\MyNumberA}{40}
\newcommand{\MyNumberB}{60}
正文如下:
\the\numexpr(\MyNumberA*\MyNumberB)\relax
将生产 2400 份。我想要打印 2,400 份或 2,400.00 份。
我的要求是否太多了?或者这能做到吗?怎么做?
答案1
您可以使用siunitx
包来执行此操作:
\documentclass{article}
\usepackage[group-separator={,},group-minimum-digits=4]{siunitx}
\begin{document}
\newcommand{\MyNumberA}{40}
\newcommand{\MyNumberB}{60}
\num{\the\numexpr(\MyNumberA*\MyNumberB)\relax}
\end{document}
生成结果:
您也可以定义自己的命令来处理这个问题:
\documentclass{article}
\usepackage{siunitx}
\newcommand\mynum[1]{\num[group-separator={,},group-minimum-digits=4]{\the\numexpr(#1)\relax}}
\begin{document}
\newcommand{\MyNumberA}{40}
\newcommand{\MyNumberB}{60}
\mynum{\MyNumberA*\MyNumberB}
\end{document}
关于非整数值的评论:
我会遵循@egreg的建议并利用内部siunitx
使用的事实expl3
。在下面的示例中,我创建了一个单独的命令来处理浮点值。我还为该宏提供了两个参数。第一个参数是可选的,允许您修改如何siunitx
处理其内容:
\documentclass{article}
\usepackage{siunitx}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand\myeval{m}{\fp_eval:n{#1}}
\ExplSyntaxOff
\newcommand\mynum[1]{\num[group-separator={,},group-minimum-digits=4]{\the\numexpr(#1)\relax}}
\newcommand\myfpnum[2][]{\num[group-separator={,},
group-minimum-digits=4,
round-integer-to-decimal,
round-mode=places,#1]{\myeval{#2}}}
\begin{document}
\def\MyNumberA{40}
\def\MyNumberB{60}
\mynum{\MyNumberA*\MyNumberB}
\def\MyNumberA{40.1349}
\def\MyNumberB{60.9982}
\myfpnum[round-precision=3]{\MyNumberA*\MyNumberB}
\end{document}
答案2
如果您还想在数字后打印两个零,请使用此siunitx
设置:
\sisetup{group-separator={,},group-minimum-digits=4,round-integer-to-decimal,round-mode=places}
梅威瑟:
\documentclass{article}
\usepackage{siunitx}
\begin{document}
\newcommand{\MyNumberA}{40}
\newcommand{\MyNumberB}{60}
\sisetup{group-separator={,},group-minimum-digits=4,round-integer-to-decimal,round-mode=places}
\num{\the\numexpr(\MyNumberA*\MyNumberB)\relax}
\end{document}
输出:
如果要更改默认的小数位数,请使用选项round-precision
。
例如,添加到\sisetup
选项中round-precision=3
,您将在整数部分后得到 3 个零。
答案3
您可以基于 定义一个新命令,利用内部使用的\num
事实:siunitx
expl3
\documentclass{article}
\usepackage[group-separator={,},group-minimum-digits=4]{siunitx}
% \usepackage{xparse} % already loaded by siunitx
\ExplSyntaxOn
\NewDocumentCommand{\numc}{ O{} m }
{
\num[#1]{ \fp_eval:n{ #2 } }
}
\ExplSyntaxOff
\begin{document}
\newcommand{\MyNumberA}{40}
\newcommand{\MyNumberB}{60}
\numc{\MyNumberA*\MyNumberB}
\numc[
group-separator={,},
group-minimum-digits=4,
round-integer-to-decimal,
round-mode=places,
]{\MyNumberA*\MyNumberB}
\end{document}
如您所见,可以采用\numc
与 相同的方式指定 的本地选项\num
。