测试数字

测试数字

如何测试给定的参数是否为数字,以便应用不同的样式?如果不是,则忽略...例如:

\domorestuffifnumber{things} -> things
\domorestuffifnumber{123}    -> \emph{123}

谢谢。

答案1

这是一个稍微有缺陷的东西,但比你要求的稍微更通用一点。

\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcommand\ifnumber[1]{%
        \begingroup
        \edef\temp{#1}%
        \expandafter\ifstrempty\expandafter{\temp}
                {\endgroup\@secondoftwo}
                {\expandafter\ifnumber@i\temp\@nnil}%
}
\def\ifnumber@i#1#2\@nnil{%
        \if-#1%
                \ifstrempty{#2}
                        {\def\temp{X}}
                        {\def\temp{#2}}%
        \else
                \def\temp{#1#2}%
        \fi
        \afterassignment\ifnumhelper
        \count@0\temp\relax\@nnil
        \endgroup
}

\def\numrelax{\relax}%
\def\ifnumhelper#1\@nnil{%
        \def\temp{#1}%
        \ifx\temp\numrelax
                \aftergroup\@firstoftwo
        \else
                \aftergroup\@secondoftwo
        \fi
}
\makeatother

\newcommand\testnumber[1]{#1: \ifnumber{#1}{Number}{Not a number}\par}
\begin{document}
\def\foo{-55}
\testnumber{1234}
\testnumber{\foo}
\testnumber{-}
\testnumber{}
\testnumber{1}
\testnumber{1234abc}
\testnumber{abc1234}
\end{document}

通过检查参数扩展中的第一个标记是否为,这有点复杂-。不幸的是,如果参数是寄存器,它就不起作用。(在其他情况下可能也不起作用。)

但从\ifnumber宏观上看,您应该很容易就能构建您想要的东西。

\newcommand\domorestuffifnumber[1]{\ifnumber{#1}{\emph{#1}}{#1}}

答案2

\documentclass{article}

\def\isnum#1{%
  \if!\ifnum9<1#1!\fi%
     \emph{#1}%
  \else#1%
  \fi}

\begin{document}

\isnum{dummy}
\isnum{123}

\end{document}

如果#1是数字,则有\ifnum9<1xxx,为真,因此为空,这导致\if!!,也为真,并且\emph{#1}是输出。在另一种情况下,我们有(#1 mybe 0a) \ifnum9<10a,为真,剩下a。因此我们比较,这是错误的,这就是为什么现在部分是输出的\if!a原因。\else

警告:不适用于数字 > 999999999。

答案3

LuaTeX 解决方案:

\documentclass{article}
\begin{document}

\directlua{ dofile("myluastuff.lua") }

\newcommand\domorestuffifnumber[1]{%
  \directlua{ 
    domorestuffifnumber("#1") 
}}

\def\foo{-55}
\domorestuffifnumber{1234}
\domorestuffifnumber{\foo}
\domorestuffifnumber{-}
\domorestuffifnumber{}
\domorestuffifnumber{1}
\domorestuffifnumber{1234abc}
\domorestuffifnumber{abc1234}
\end{document}

myluastuff.lua文件:

function domorestuffifnumber( arg )
  if tonumber(arg) then 
    tex.sprint("\\emph{" .. arg .. "}") 
  else
    tex.sprint(arg or "")
 end
end

我认为该解决方案非常易读。

答案4

xstring包提供了两个命令:\IfInteger\IfDecimal。它们每个都使用语法

\IfInteger{<value being tested>}{<result if true>}{<result if false>}

如果你不想区分整数和小数,我们可以这样做

\documentclass{article}
\usepackage{xstring}

\newcommand{\DoStuff}[1]{\emph{#1}}

\newcommand{\IfNumber}[1]
{%
  \IfInteger{#1}
    {\DoStuff{#1}}
    {%
      \IfDecimal{#1}
        {\DoStuff{#1}}
        {#1}%
    }%
}

\begin{document}

\IfNumber{123}

\IfNumber{123.123}

\IfNumber{abc}

\end{document}

相关内容