计算价格

计算价格

我想在 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而不是,它可以操作具有有效数字和广泛指数的浮点数。 只要您不操作高于美分的数量(高于此数量,将出现舍入误差),这对您来说就足够了。pgfmathl3fp1610^{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 系统上安装。

最后,\EUReurosym 包的命令打印出官方正确的欧元符号。同样,Python 代码负责符号替换。

Pweave 货币区域设置示例输出

%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}

相关内容