算术运算结果的位数

算术运算结果的位数

根据 J.Wright 的回答 我想计算操作的字符数。然而,下面代码的输出是

16 123212

我期望计算前一个字符的数量,而不是粗体数字12321。我做错了什么?

\documentclass{standalone} 
\usepackage{pgfplots}

\usetikzlibrary{calc}

\def\zCountDigits#1{%
  \number\numexpr0\zCountDigitsAux#1\zCountDigitsEnd\relax
}
\def\zCountDigitsAux#1{%
  \ifx\zCountDigitsEnd#1\else+1\expandafter\zCountDigitsAux\fi
}
\def\zCountDigitsEnd{\zCountDigitsEnd}

\begin{document}

\newcommand{\eval}[1]{\pgfmathparse{#1}\pgfmathresult}

% the result of the next is 16, as should
\zCountDigits{0123456789ABCDEF}
% the evaluation gives 12321
\eval{int(111*111)}  
% but the counting the result gives 2, not five
\zCountDigits{\eval{int(111*111)}} 

 \end{document}

答案1

常见的问题:\eval不可扩展。

这是一个更直接的实现expl3

\documentclass{article}
\usepackage{xparse,xfp}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\CountDigits}{m}
 {
  \cp_count_digits:e { #1 }
 }
\cs_new:Nn \cp_count_digits:n { \tl_count:n { #1 } }
\cs_generate_variant:Nn \cp_count_digits:n { e }

\ExplSyntaxOff

\begin{document}

% the result of the next is 16, as it should
\CountDigits{0123456789ABCDEF}
% the evaluation gives 12321
\inteval{111*111}
% the counting of digits in the result gives 5, as it should
\CountDigits{\inteval{111*111}} 

\end{document}

在此处输入图片描述

答案2

@egreg 解释了你的方法失败的原因:你的宏不可扩展。有两种选择:要么换个方式,使用机器expl3。这样做没有错。另一方面,如果你使用pgftikz和/或pgfplots,最好将这些函数构建到 pgf 生态系统中。对于许多函数来说,这已经完成了,特别是digitsum 已经可用。所以你可以直接使用它。我实际上建议不要使用宏,而是建议使用解析和数字打印机,但我也添加了一个宏。

\documentclass{article} 
\usepackage{pgf}
\makeatletter
\newcount\c@Digits
\newcount\c@Powers
\pgfmathdeclarefunction{digitcount}{1}{%
  \begingroup%
  \global\c@Digits=0%
  \expandafter\DigitCount@i#1\@nil%
  \pgfmathparse{int(\the\c@Digits)}%
  \pgfmathsmuggle\pgfmathresult\endgroup}
\def\DigitCount@i#1#2\@nil{%
  \advance\c@Digits by \@ne%
  \ifx\relax#2\relax\else\DigitCount@i#2\@nil\fi%
}
\makeatother
\newcommand{\DigitCount}[1]{\pgfmathparse{digitcount(int(#1))}\pgfmathresult}
\begin{document}
If you really want a marco: \DigitCount{111*111}

Cross--check: \pgfmathparse{int(111*111)}\pgfmathprintnumber\pgfmathresult

I'd suggest parsing within the pgf system: \pgfmathparse{digitcount(int(111*111))}\pgfmathprintnumber\pgfmathresult

Works with strings, too: \pgfmathparse{digitcount("0123456789ABCDEF")}\pgfmathprintnumber\pgfmathresult
\end{document}

在此处输入图片描述

相关内容