格式化 interger64 对象

formatting an interger64 object

require(bit64)
a = c(500184833384,1803618000152,25053117000164)
b = as.integer64(a)

sprintf("%014.0f" ,a) # returns what I want/expected
# "00500184833384" "01803618000152" "25053117000164"

sprintf("%014.0f" ,b) # I don't understand this behavior
# "00000000000000" "00000000000000" "00000000000000"

背景

我正在使用 data.table 包中的 fread 将数据导入 R。某些字段会自动读取为 integer64 个对象。我正在尝试格式化这些字段。特别是,我希望它们以固定宽度打印,必要时在左侧填充零。我正在尝试使用 sprintf;我也试过 format,它似乎有针对 integer64 对象的特定方法,但没有运气。

问题

如何格式化 class integer64 的对象?特别是,如何打印具有固定宽度的对象,必要时在左侧填充零?

查看具有 dput 的对象通常很有用:

> dput(b)
structure(c(2.47124142745862e-312, 8.91105692095995e-312, 1.23778844310223e-310
), class = "integer64")

所以在内部它们只是非常小的数字。

> cat(b)
2.471241e-312 8.911057e-312 1.237788e-310

但是他们有打印方法:

> print(b)
integer64
[1] 500184833384   1803618000152  25053117000164
> sprintf("%014.0f" , print(b) )
integer64
[1] 500184833384   1803618000152  25053117000164
[1] "00000000000000" "00000000000000" "00000000000000"

嗯?好吧,print 函数尽了最大努力,但将原始值作为数字 class 对象发送到 sprintf。

> sprintf("%014.0f" , as.character(b) )
Error in sprintf("%014.0f", as.character(b)) : 
  invalid format '%014.0f'; use format %s for character objects
> sprintf("%014.0s" , as.character(b) )
[1] "00000000000000" "00000000000000" "00000000000000"

疯了。需要删除字符 class 参数的小数点格式:

> sprintf("%014s" , as.character(b) )
[1] "00500184833384" "01803618000152" "25053117000164"