格式化 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"
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"