\total
\FPeval{\q}{clip(100*trunc(\total :0))}
\q \\
\FPeval{\total}{clip(100*\total)}
\total \\
\FPeval{\q1}{clip(\total -\q)}
\q1
输出
1259.86
125900
125986
861 %the out put corret is 86
答案1
这行\FPeval{\q1}{clip(\total -\q)}
语法不正确;你试图定义一个名为的变量\q1
,但 TeX 坚决不同意,因为控制序列仅由
- 单个非字母,或
- 一系列字母。
名称\q1
不符合要求。从实现上讲,您不会得到任何错误,但该行本质上相当于
\FPeval{\q}{clip(\total -\q)}
下面\q1
打印的值\q
,即86,然后打印1。
使用不同的名称:
\documentclass{article}
\usepackage[nomessages]{fp}
\begin{document}
\FPeval{\total}{1259.86}
\total
\FPeval{\q}{clip(100*trunc(\total :0))}
\q
\FPeval{\total}{clip(100*\total)}
\total
\FPeval{\qone}{clip(\total -\q)}
\qone
\end{document}
实际上,你可以将计算的最终结果保存在字符串中。例如,
\documentclass{article}
\usepackage[nomessages]{fp}
\begin{document}
\FPeval{\total}{1259.86}
\total
\FPeval{\q}{clip(100*trunc(\total :0))}
\q
\FPeval{\total}{clip(100*\total)}
\total
\FPeval{q1}{clip(\total -\q)}
\FPprint{q1}
\end{document}
可以。实际上,不推荐这种做法:据我所知,手册中甚至没有提到它。
expl3
这是使用其强大的浮点模块的不同方法。
\documentclass{article}
\usepackage{xparse}
\usepackage{fmtcount}
\ExplSyntaxOn
\NewDocumentCommand{\spellnumber}{m}
{
\numberstringnum { \pokefaker_part_i:n { #1 } }
\tl_if_empty:eF { \pokefaker_part_f:n { #1 } }
{
\c_space_tl point \c_space_tl
\numberstringnum { \pokefaker_part_f:n { #1 } }
}
}
\NewExpandableDocumentCommand{\IPart}{m}
{
\pokefaker_part_i:n { #1 }
}
\NewExpandableDocumentCommand{\FPart}{m}
{
\pokefaker_part_f:n { #1 }
}
\cs_generate_variant:Nn \tl_range:nnn { e }
\prg_generate_conditional_variant:Nnn \tl_if_empty:n { e } { T,F,TF,p }
\cs_new:Nn \pokefaker_part_i:n
{
\fp_eval:n { floor(#1) }
}
\cs_new:Nn \pokefaker_part_f:n
{
\tl_range:enn { \fp_eval:n { #1 - floor(#1) } } { 3 } { -1 }
}
\ExplSyntaxOff
\begin{document}
\IPart{1259.86}
\FPart{1259.86}
\spellnumber{1259.86}
\spellnumber{2*(596.48+33.45)}
\end{document}
您不必事先知道小数位数。\tl_range:nnn
我们可以提取从第三个到最后一个字符;0.
如果整数部分为零,则始终返回一个带前导的浮点数。我检查结果字符串是否为空,并在其非空的情况下输出小数部分;如果计算结果中缺少小数部分,则不打印任何内容。
的参数\spellnumber
,\IPart
和\FPart
可以是“fp 表达式”。例如\spellnumber{round(pi)}
将打印“三点十四”。
这可以扩展以处理负数。
将其本地化为不同的语言并不困难。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[italian,spanish]{babel}
\usepackage{xparse}
\usepackage{fmtcount}
\providecommand{\decimalseparatorword}{point}
\addto\captionsitalian{\renewcommand{\decimalseparatorword}{virgola}}
\addto\captionsspanish{\renewcommand{\decimalseparatorword}{coma}}
\ExplSyntaxOn
\NewDocumentCommand{\spellnumber}{m}
{
\numberstringnum { \pokefaker_part_i:n { #1 } }
\tl_if_empty:eF { \pokefaker_part_f:n { #1 } }
{
\c_space_tl \decimalseparatorword \c_space_tl
\numberstringnum { \pokefaker_part_f:n { #1 } }
}
}
\NewExpandableDocumentCommand{\IPart}{m}
{
\pokefaker_part_i:n { #1 }
}
\NewExpandableDocumentCommand{\FPart}{m}
{
\pokefaker_part_f:n { #1 }
}
\cs_generate_variant:Nn \tl_range:nnn { e }
\prg_generate_conditional_variant:Nnn \tl_if_empty:n { e } { T,F,TF,p }
\cs_new:Nn \pokefaker_part_i:n
{
\fp_eval:n { floor(#1) }
}
\cs_new:Nn \pokefaker_part_f:n
{
\tl_range:enn { \fp_eval:n { #1 - floor(#1) } } { 3 } { -1 }
}
\ExplSyntaxOff
\begin{document}
\IPart{1259.86}
\FPart{1259.86}
\spellnumber{1259.86}
\spellnumber{2*(596.48+33.45)}
\selectlanguage{italian}
\IPart{1259.86}
\FPart{1259.86}
\spellnumber{1259.86}
\spellnumber{2*(596.48+33.45)}
\end{document}