유효한 부동 소수점 수 확인 중

유효한 부동 소수점 수 확인 중

다음을 수행하고 싶습니다. 영국식 또는 미터법 단위로 설정할 수 있는 보고서를 생성 중입니다. 모든 값은 원래 미터법 단위이므로 영국식 단위의 경우 모든 값을 변환해야 합니다. 일부 값은 해당 값을 적용할 수 없는 경우 N/A 또는 다른 문자열 값일 수 있습니다. 문서가 자동으로 생성됩니다. 변환을 위해 fp 패키지를 사용하고 있지만 입력을 확인하는 것이 문제입니다. 숫자가 아닌 값으로 수학을 수행하려고 하면 fp 패키지(및 pgfmath)는 물론 오류가 발생합니다. 이것이 내가 현재 가지고 있는 것입니다(정수 입력에만 작동함).

% Convert meters to inches
\newcommand{\convertmtoin}[2]
{
    \if!\ifnum9<1#1!\else_\fi   
    \FPeval{val}{#1*39.3700787} \FPround{\val}{\val}{#2}
    \else
    \def\val{#1}
    \fi
}

pgfmath를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

\newcommand{\convertmtoin}[2]
{
    \pgfmathfloatparsenumber{#1}
    \pgfmathfloatifflags{\pgfmathresult}{3}{\FPeval{val}{#1*39.3700787} \FPround{\val}{\val}{#2}}{\def\val{#1}} 
}

하지만 pgfmathfloatparsenumber에 잘못된 입력이 있는 경우 NaN을 출력하도록 pgfmath의 오류 처리기를 설정할 수 없습니다.

\pgfkeys{/pgf/fpu/handlers/invalid number={??}{??}}

어떤 도움을 주셔서 감사합니다!

답변1

\IfDecimal다음에서 사용할 수도 있습니다 .패키지xstring:

여기에 이미지 설명을 입력하세요

암호:

\documentclass{article}
\usepackage{xstring}

\newcommand*{\CheckIfNumerical}[1]{%
    \IfDecimal{#1}{%
        ``#1" is a number.%
    }{%
        ``#1" is NOT a number.%
    }%
}%


\begin{document}
\par\CheckIfNumerical{7}
\par\CheckIfNumerical{3.14}
\par\CheckIfNumerical{NaN}
\par\CheckIfNumerical{7. 0}
\par\CheckIfNumerical{7.0X09}
\end{document}

답변2

네거티브를 처리하도록 업데이트되었습니다.

\testreal문자열의 모든 바이트를 확인하는 재귀 루프를 설정하는 호출입니다 .

첫째, 문자열의 나머지 부분이 유효한 실수인지 여부에 영향을 주지 않기 때문에 선행 음수가 존재하는 경우 이를 제거합니다.

남은 것은 다음과 같습니다. 문자열에서 아직 숫자나 소수점이 발견되지 않았지만 유효한 실수라고 가정합니다.

각 연속 바이트를 거치면서 십진수나 숫자가 아닌 것을 찾으면 테스트는 "실패" 상태로 전환됩니다. 문자열에서 두 개의 소수점을 찾으면 테스트도 실패합니다. 그러나 두 테스트가 모두 통과되더라도 테스트를 통과하려면 적어도 하나의 숫자를 찾아야 합니다.

\documentclass[]{article}

\def\testreal#1{\def\founddigit{F}\def\itsanumber{T}\def\fndpt{F}%
  \edef\tmp{\testleadneg#1\relax}%
  \expandafter\testrealhelper\tmp\relax%
  \if T\founddigit\itsanumber\else F\fi}

\def\testrealhelper#1#2\relax{%
\if.#1\if T\fndpt\def\itsanumber{F}\else\def\fndpt{T}\fi\else
\if1#1\FD\else
\if2#1\FD\else
\if3#1\FD\else
\if4#1\FD\else
\if5#1\FD\else
\if6#1\FD\else
\if7#1\FD\else
\if8#1\FD\else
\if9#1\FD\else
\if0#1\FD\else\def\itsanumber{F}%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
\if\relax#2\else\testrealhelper#2\relax\fi}

\def\testleadneg#1#2\relax{\if-#1#2\else#1#2\fi}

\def\FD{\def\founddigit{T}}
\begin{document}
\testreal{just}    \testreal{-just}

\testreal{123John} \testreal{-123John}

\testreal{324.56}  \testreal{-324.56}

\testreal{.}       \testreal{-.}

\testreal{23.4.56} \testreal{-23.4.56}

\testreal{346}     \testreal{-346}
\end{document} 

여기에 이미지 설명을 입력하세요

답변3

datatool인수가 숫자인지 여부를 테스트하기 위한 조건을 제공합니다.

여기에 이미지 설명을 입력하세요

\documentclass{article}
\usepackage{datatool}% http://ctan.org/pkg/datatool
\newcommand{\testreal}[1]{\ifthenelse{\DTLisnumerical{#1}}{T}{F}}
\begin{document}

\testreal{just}

\testreal{123John}

\testreal{324.56}

\testreal{.}

\testreal{23.4.56}

\testreal{346}
\end{document}

있고\DTLisnumerical\DTLifnumerical . 섹션을 참조하세요2.2 ifthen 조건부(p 16) 중datatool사용자 설명서.

답변4

나는 당신의 의도가 무엇인지 잘 이해하지 못했지만 여기에 PGF 솔루션을 생각해내는 간단한 예가 있습니다.

\documentclass[]{article}
\usepackage{pgf}
\usepgflibrary{fpu}

\pgfmathdeclarefunction{m2in}{1}{%
\begingroup
\pgfkeys{/pgf/fpu}
\pgfmathfloatparsenumber{#1}
\pgfmathfloatifflags{\pgfmathresult}{3}{%True Not a number
    \def\pgfmathresult{3Y0.0e0]}%
    \pgfmathfloattofixed{\pgfmathresult}%
    }{% False it is a number including inf
    \pgfmathfloatparsenumber{#1}%
    \pgfmathfloatmultiplyfixed{\pgfmathresult}{39.3700787}%
    \pgfmathfloattofixed{\pgfmathresult}%
    }
    \pgfmathsmuggle\pgfmathresult%
\endgroup
}%

\pgfkeys{/pgf/fpu/handlers/invalid number/.code={%
  \pgfmathfloatparsenumber{3Y0.0e0]}%
  }
}

\begin{document}
\pgfmathfloatparsenumber{435...}% NaN
    \pgfmathprintnumber[fixed]{\pgfmathresult}
    
\pgfmathfloatparsenumber{la la laa}% NaN
    \pgfmathprintnumber[fixed]{\pgfmathresult}

\pgfmathparse{m2in(1.000)}\pgfmathprintnumber[fixed,precision=5]\pgfmathresult

\pgfmathparse{m2in(4..4)}\pgfmathresult
\end{document}

이것은 줄 것이다

NaN

NaN

39.37007

관련 정보