格式化interger64对象

时间:2015-02-14 15:08:18

标签: r printf

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"

背景

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

问题

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

1 个答案:

答案 0 :(得分:0)

使用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函数给出了最好的尝试,但是将原始值作为数字类对象发送到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"

螺母。需要删除字符类参数的小数点格式:

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