打印时格式化数字

打印时格式化数字

有没有办法在打印时格式化数字字符串?

假设我有以下声明:

\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事实:siunitxexpl3

\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

在此处输入图片描述

相关内容