使用 hyperref 在表单中定义 Javascript 函数

使用 hyperref 在表单中定义 Javascript 函数

我有来自 hyperref 包的环境 Form 的 TextFields。但是我想添加 TextFields 的值并在另一个 TextField 中打印总和。使用以下代码效果很好:

\begin{Form}\fbox{
\TextField[width=.9\textwidth, name=sum,
calculate = {
this.getField('sum').value =
this.getField('a20').value +
this.getField('a21').value +
this.getField('a22').value +
this.getField('a23').value;
}
]{~}}
\end{Form}

我的问题是,如果 a20 为空,则 + 不会添加值 0,而是将所有后续值(如字符串)连接起来。此外,我想将输入(如 42,50)转换为 42.50 形式,以像浮点数一样计算它们。

因此我尝试定义这样的 Javascript 函数,但是它不起作用:

\begin{Form}\fbox{
\TextField[width=.9\textwidth, name=sum,
calculate = {
this.getField('sum').value =
isNumber(this.getField('a20').value) +
this.getField('a21').value +
this.getField('a22').value +
this.getField('a23').value +
this.getField('a24').value;
},
function isNumber(n) {
   n = n.replace(/\./g, '').replace(',', '.');
   return !isNaN(parseFloat(n)) && isFinite(n);
}
]{~}}
\end{Form}

错误在于,该函数显然位于错误的位置。有办法让它正常工作吗?

谢谢!

答案1

您可以简单地将值转换为数字。如果用户输入字符串(字母),这将导致“NaN”输出,但对于用户来说,显然出了问题。

表单

\documentclass[a4paper,10pt]{article}

\usepackage{hyperref}

\begin{document}
\begin{Form}
\TextField[width=.9\textwidth, name=a20]{~}\\
\TextField[width=.9\textwidth, name=a21]{~}\\
\TextField[width=.9\textwidth, name=a22]{~}\\
\TextField[width=.9\textwidth, name=a23]{~}\\
\fbox{
\TextField[width=.9\textwidth, name=sum,
calculate = {
this.getField('sum').value =
(Number(this.getField('a20').value.replace(',', '.')) +
Number(this.getField('a21').value.replace(',', '.')) +
Number(this.getField('a22').value.replace(',', '.')) +
Number(this.getField('a23').value.replace(',', '.'))).toString().replace('.', ',');
}
]{~}}
\end{Form}
\end{document}

编辑:由于我怀疑您想要显示货币,因此您可能想要使用.toFixed(2)总计。

固定的

\documentclass[a4paper,10pt]{article}

\usepackage{hyperref}

\begin{document}
\begin{Form}
\TextField[width=.9\textwidth, name=a20]{~}\\
\TextField[width=.9\textwidth, name=a21]{~}\\
\TextField[width=.9\textwidth, name=a22]{~}\\
\TextField[width=.9\textwidth, name=a23]{~}\\
\fbox{
\TextField[width=.9\textwidth, name=sum,
calculate = {
this.getField('sum').value =
(Number(this.getField('a20').value.replace(',', '.')) +
Number(this.getField('a21').value.replace(',', '.')) +
Number(this.getField('a22').value.replace(',', '.')) +
Number(this.getField('a23').value.replace(',', '.'))).toFixed(2).toString().replace('.', ',');
}
]{~}}
\end{Form}
\end{document}

相关内容