我想在 LaTex 文件中计算价格。这意味着我想将两个精确到 2 位小数的数字相加,然后将这两个值乘以一个整数。
另一件事是输出格式。数字应像这样打印:1.234.567,89(我想在德国使用它,在那里我们这样写数字)。
我知道 LaTeX 中有很多用于计算的包,但我认为/希望有一个专门用于货币值的包。
答案1
前列腺素F
您可能想看看的数学能力pgf
。我准备了一个 MWE:
\documentclass{standalone}
\usepackage{pgf}
\usepgflibrary{fpu}
\pgfkeys{
/pgf/fpu = true,
/pgf/number format/.cd,
precision=2,
fixed,
fixed zerofill,
use comma,
1000 sep={.}
}
\begin{document}
\pgfmathparse{2*(1234.56+9786.45)}
\pgfmathprintnumber{\pgfmathresult}
\end{document}
输出将会像这样
要处理大量数字,您需要加载fpu
库。(谢谢你,杰克)
选择
您的问题有点不清楚,但如果只是关于排版货币,您可以滥用该siunitx
包并做这样的事情,
\documentclass{standalone}
\usepackage{marvosym}
\usepackage{siunitx}
\sisetup{
group-separator = {.},
round-mode = places,
round-precision = 2,
output-decimal-marker = {,}
}
\DeclareSIUnit\euro{\EUR}
\begin{document}
\SI{1234567.8499999}{\euro}
\end{document}
这导致以下输出
答案2
Henri Menke 的答案非常好,但没有涵盖在显示大数字之前要对它们执行运算的情况(的范围相当有限)。我会使用pgfmath
而不是,它可以操作具有有效数字和广泛指数的浮点数。 只要您不操作高于美分的数量(高于此数量,将出现舍入误差),这对您来说就足够了。pgfmath
l3fp
16
10^{16}
\documentclass{standalone}
\usepackage{marvosym}
\usepackage{siunitx}
\sisetup{
group-separator = {.},
round-mode = places,
round-precision = 2,
output-decimal-marker = {,}
}
\DeclareSIUnit\euro{\EUR}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand {\SIeval} {omom}
{ \SI [#1] { \fp_eval:n {#2} } [#3] {#4} }
\ExplSyntaxOff
\begin{document}
\SIeval{(1234567.85 + 252346.42) * 1.196}{\euro}
\end{document}
该fp
包也可以使用,虽然语法不太实用,但范围更广,因为它可以操作18
小数点前后有数字的定点数(如果我没记错的话)。
答案3
我会在这里给出一个几乎正交的答案/评论。原始的 TeX 引擎只有整数运算,而 TeX 是图灵完备语言,通过整数运算实现浮点运算当然是可能的(我相信包的名称是浮点或类似的东西),这是一个完美的例子,其中实际使用LuaTeX发动机或PythonTeX在我看来,使用除原始引擎之外的任何引擎进行包装在哲学上都是正确的方法。
我刚刚在周末第一次在日常工作中使用了 PythonTeX,它真是太棒了。
这是快速而粗糙的 lua 版本。您必须使用 lualatex 才能使其工作!
\documentclass{standalone}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
result = 2*(1234.56+9786.45)
out = string.format("%.2f",result)
tex.print(out)
\end{luacode*}
\end{document}
显然,你可以用以下代码替换整个 Lua 代码:
\documentclass{standalone}
\begin{document}
\directlua{tex.print(string.format("%.2f",2*(1234.56+9786.45)))}
\end{document}
并忘记完全加载 luacode 包。
这是 PythonTeX。您必须先运行 pdflatex、lualatex 或 xelatex,然后运行 pythontex 脚本,再运行一次引擎。它不适用于 Don 的引擎!
\documentclass{standalone}
% Begin engine=specific settings
\expandafter\ifx\csname pdfmatch\endcsname\relax
\else
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\fi
% xetex:
\expandafter\ifx\csname XeTeXinterchartoks\endcsname\relax
\else
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\fi
% luatex:
\expandafter\ifx\csname directlua\endcsname\relax
\else
\usepackage{fontspec}
\fi
% End engine-specific settings
% Generic packages for PythonTeX.
\usepackage{amsmath,amssymb}
\usepackage{fullpage}
\usepackage{graphicx}
\usepackage[svgnames]{xcolor}
\usepackage{url}
\urlstyle{same}
\usepackage[makestderr]{pythontex}
\restartpythontexsession{\thesection}
\usepackage[framemethod=TikZ]{mdframed}
\begin{document}
\begin{pylabcode}
result = 2*(1234.56+9786.45)
print("{0:.2f}".format(result))
\end{pylabcode}
\end{document}
正如人们所看到的,上述文件的大部分内容只是设置 :) 还请注意,Python 有更好的方法来处理货币计算。以上只是一个玩具示例。
答案4
编织
...这是编织例如。它只需要两个编译步骤;比 PythonTeX 少一个。
可以找到 Pweave(和 Sweave)的介绍文章这里。
第一行注释解释了如何在 GNU/Linux 系统上安装 Pweave。第二行注释指示如何编译 .Pnw 文件以获取 .tex 和 .pdf 文件。
在此示例中,Python 使用系统区域设置来确定小数和千位分组符号,以及货币符号的位置和类型。
要实现此功能,需要在您的系统上安装所引用的语言环境。Python 注释解释了如何在 Debian GNU/Linux 系统上安装。
最后,\EUR
eurosym 包的命令打印出官方正确的欧元符号。同样,Python 代码负责符号替换。
%sudo easy_install -U Pweave
%Pweave -f tex filename.Pnw | pdflatex -synctex=1 -interaction=nonstopmode filename.tex
\documentclass{article}
%document encoding
\usepackage[utf8]{inputenc}
%official euro symbol
\usepackage{eurosym}
\begin{document}
<%
from locale import setlocale, LC_ALL, currency
def money(value):
return str(currency(value, grouping=True)).replace('€','\EUR')
amount = 2 * (1234.56 + 9786.45)
#To install additional locales in Debian GNU\Linux: sudo dpkg-reconfigure locales
setlocale(LC_ALL, 'de_DE.utf8')%>
In Deutschland hatt diese L\"{o}sung einen Wert von <%=money(amount)%>.
<%setlocale(LC_ALL, 'de_BE.utf8')%>
In Belgien hatt diese L\"{o}sung einen Wert von <%=money(amount)%>.
<%setlocale(LC_ALL, 'en_IE.utf8')%>
In Ireland, this solution is worth <%=money(amount)%>.
<%setlocale(LC_ALL, 'en_GB.utf8')%>
In the UK, this solution is worth <%=money(0.85504 * amount)%>.
\end{document}