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»。这样纬度和经度秒将具有相同的字符数
显然我误解了 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»。这样纬度和经度秒将具有相同的字符数