exiftool 中恒定宽度 lat/long 的 printf 数字格式

printf number format for constant width lat/long in exiftool

显然我误解了 printf 手册页。 (否则它是 exiftool 10.55 和 10.77 中的错误)

我正在尝试使用 exiftool 从图像文件中获取 GPS 坐标。我想让它们的宽度相同并且没有不必要的空格。

我试过的格式字符串,结果之一:

-coordFormat "%03d°%02d′%0d%02.5f″"
042°37′280.00000″ N, 002°05′510.00000″ W

(我不需要小数点后五位——我只是暂时把它放在一起,看看是否有任何相机在精度方面不诚实。)三个不必要的空格无济于事;它们不在格式字符串的控制范围内,但我确实去掉了其他默认的。纬度的前导零不是必需的,但它存在是因为经度使用相同的格式字符串。一个问题是在 floor(seconds) 和它的小数点之间插入了伪造的零。另一个问题是错误的小数部分。该文件的默认格式是 42 deg 37' 28.39" N, 2 deg 5' 51.96" W

有人的“cheat sheet”说我的第二位应该是宽度,包括小数点,所以我把秒改成“%08.5f”但所做的只是在小数点前添加另一个伪造的零,例如 510.00000→5100.00000(宽度为十,而不是八!)。

几年前,我做过类似的事情,得到了正确的结果。但是我懒得保存脚本"for future reference."

(其他几位 SO answers 同意 "cheat sheet.")

第一个数字是宽度,第二个数字是小数点位数,因此您当前拥有的 (%2.5f) 似乎是倒退的。 %5.2f 会给你一个占 5 个字符且有 2 个小数位的数字。对于像 510 这样大的数字,您可能希望将其设置为 %6.2f

%0d 让你失望了。模板的那部分正在消耗坐标的“51.0”秒分量,没有为模板的 %02.5d 部分留下任何东西。

printf "%0d", 51         ===>   "51"
printf "%02.5f";         ===>   "0.00000"

printf "%0d%02.5f", 51   ===>   "510.00000"

所以失去了%0d.

%02.5f 中的 2 对你也没有任何好处。小数点前的数字是字段的最小长度,小数点后的数字是要使用的小数位数。由于将打印 5 位小数,因此输出将至少为 7 个字符,并且 2 值将被忽略。

问题似乎出在 seconds 字段,您的格式说明符是 %0d%02.5f。我不确定您的意图,但每个要呈现的值只能有一个 %

如果您正在格式化经度,那么您处理的是 -180 到 180 之间的值。如果您想要五个小数点,那么总宽度将为

  • 符号 +-
  • 的一个字符
  • 整数部分三个字符
  • 小数点一个字符.
  • 五位小数

总字段宽度为 10。您的完整说明符将是 %0+10.5f,输出介于 «-180.00000» 和 «+180.00000»

之间

您可以使用 space 标志而不是 +,如 %0 10.5f,它将使用 space 而不是 +表示正数,将 180 呈现为 « 180.00000»。前导零在那里,因此零用于填充完整的十个字符字段

处理纬度时,总宽度需要小一个字符。 %0+9.5f 将导致 «-90.00000» 到 «+90.00000» 的范围。当然,您可以使用与经度相同的格式说明符,这将产生 «-090.00000» 到 «+090.00000»。这样纬度和经度秒将具有相同的字符数