我正在处理一份发票文件,该文件在发票项目的几行之后的末尾有一个“总计”。因此,我需要对每行的总数进行连续计数。使用传统的\newcounter
和\addtocounter
计数器不起作用,因为它不接受小数,而货币通常有小数。
创建和维护一个可以添加包含小数的数字的变量的推荐方法是什么?
答案1
expl3
这是一个使用语法及其变量的非常“简单”的方法\fp_...
。
由于问题不是完全清楚,我提供了一些用于加减以及重置和显示总和的宏。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\fp_new:N \g_total_sum_fp
\NewDocumentCommand{\AddValue}{m}{
\fp_gadd:Nn \g_total_sum_fp {#1}
}
\NewDocumentCommand{\SubValue}{m}{
\fp_gsub:Nn \g_total_sum_fp {#1}
}
\NewDocumentCommand{\ResetSum}{}{
\fp_zero:N \g_total_sum_fp
}
\NewDocumentCommand{\DisplaySum}{}{
\fp_to_decimal:N \g_total_sum_fp
}
\ExplSyntaxOff
\begin{document}
\AddValue{4.5}
\DisplaySum
\AddValue{10.5}
\DisplaySum
\AddValue{2}
\DisplaySum
\AddValue{17}
\DisplaySum
\AddValue{-2}
\DisplaySum
\ResetSum
\DisplaySum
\end{document}
您可以在此处找到相关问题:数字格式化、addtocounter 和 calc 包
答案2
您可以使用普通的 TeX 计数器来计算金钱。该计数器以便士为单位存储数值。
\newcount\tmpvar
\newcount\myvar
\def\addvar#1#2 {\let\tmp=#1\addvarA #2.\end}
\def\addvarA#1.#2\end{\advance\tmp by #100
\ifx;#2;\else\ifx.#2\else\addvarB#1.#2\fi\fi}
\def\addvarB#1.#2#3.{\advance\tmp by \ifnum#1<0-\fi #2#3\ifx;#3;0\fi\space}
\def\printvar#1{\tmpvar=#1%
\divide\tmpvar by100
\ifnum\tmpvar=0 \ifnum#1<0-\fi\fi \the\tmpvar
\multiply\tmpvar by-100 \advance\tmpvar by#1%
\ifnum\tmpvar=0 \else.%
\ifnum\tmpvar<0 \tmpvar=-\tmpvar \fi
\ifnum\tmpvar<10 0\fi \the\tmpvar
\fi
}
% test:
\myvar=0
\addvar\myvar 3.45
\addvar\myvar -5
\addvar\myvar 1.5
\printvar\myvar % -0.05 is printed
\myvar=0
\addvar\myvar 2.3
\printvar\myvar % 2.3 is printed
\myvar=0
\addvar\myvar 123.
\addvar\myvar 0.01
\printvar\myvar % 123.01 is printed