将小时转换为十进制数

将小时转换为十进制数

我正在尝试制作一个命令,将小时(例如:“14:17”)转换为十进制值(小时+分钟/60 = 14.28333333333),以用于 TikZ 计划:

\creneau[day=1, start=13.5, end=\hourtodec{14:17}]{Maths}

-> 星期一 (day=1),13:30 至 14:17:数学

xstring我已经知道如何使用包(\StrBefore{14:17}{:}和)从 14:17 中提取数字\StrBehind{14:17}{:},但我不知道如何计算分钟(calc包仅适用于整数)。

答案1

可以通过 TeX 本身完成:

\documentclass{article}
\usepackage[francais]{babel}
\makeatletter
\newcommand*\dechour[1]{\expandafter\dechour@i#1\@nil}
\def\dechour@i#1:#2\@nil{\strip@pt\dimexpr #1pt+#2pt/60\relax}
\makeatother
\begin{document}

\shorthandoff{:}
\dechour{12:31}

\dechour{12:30}

\def\mbf{10:20} and \dechour{\mbf}
\end{document}

在此处输入图片描述

答案2

\usepackage{fp}

\newcommand\dechour[1]{\splithour#1!}
\def\splithour#1:#2!{\FPupn\result{60 #2 / #1 +}\FPround\result\result{5}\result}

\begin{document}
\dechour{12:31}

\dechour{12:30}
\end{document}

这将打印

12.51667
12.50000

答案3

虽然在 TeX 中可以解析这些简单的表达式并进行简单的计算,但我更喜欢使用 luatex 来完成此类任务。这是 ConTeXt 中的解决方案,我使用预定义的 lpeg 模式来匹配整数。

\startluacode
  local C, P    = lpeg.C, lpeg.P
  local integer = lpeg.patterns.integer
  local match   = lpeg.match

  local function hourtodec(hour, min)
    return hour + min/60
  end

  local pattern = C(integer) * P(':') * C(integer) / hourtodec

  function commands.hourtodec(hour)
    return context(match(pattern, hour))
  end
\stopluacode

\def\hourtodec#1{\ctxcommand{hourtodec("#1")}}

\starttext
\hourtodec{14:17}
\stoptext

几乎相同的解决方案在 LaTeX 中有效,只需用 lua 代码替换 ConTeXt 提供的一些便利函数即可

\documentclass{article}

\usepackage{luacode}

\begin{luacode}
  local C, P, R = lpeg.C, lpeg.P, lpeg.R
  local integer = R('09')^1
  local match   = lpeg.match

  local function hourtodec(hour, min)
    return hour + min/60
  end

  local pattern = C(integer) * P(':') * C(integer) / hourtodec

  commands = commands or {}

  function commands.hourtodec(hour)
    return tex.print(match(pattern, hour))
  end
\end{luacode}

\def\hourtodec#1{\directlua{commands.hourtodec("#1")}}

\begin{document}
\hourtodec{14:17}
\end{document}

相关内容