【发布时间】:2019-05-28 07:32:14
【问题描述】:
在准备一个将标准化双精度数转换为十进制数的函数时,我需要以下内容:
substr(01001011, 2, 5) # what is in fact:"0010" (because leading 0 is ignored)
substr(01001011, 2, 5) # what I want:"1001"
substr("01001011", 2, 5) # "1001"; gives what I want BUT the following:
在substr("01001011", 2, 5) 中,(对我而言)不可能将其转换为函数,因为input=01001011 和双引号连接非常有问题。每次用户必须手动输入参数的值,而不是在函数调用中,而是在 substr(...) 部分所在的函数体中。
01001011 被保留为数字,因此所有前导 0 都被忽略。
01001011 # [1] 1001011
class(01001011) # "numeric"
substrCorrectly <- function(x) {
substr("x", 2, 5) }
例如,对于数字“01001011”;
substrCorrectly <- function(x) {
substr("01001011", 2, 5) }
substrCorrectly(01001011) # "1001"
这个函数肯定很丑,和函数的概念背道而驰:每次用户在应用之前都必须改变函数体!
有什么想法吗?
更多示例:
substr(000101001011, 1, 4) # "1010"; but what I want is 0001 here.
substr(10001, 1, 2) # "10" and what I want (10) coincides since 1 is leading.
【问题讨论】:
-
有没有办法计算出这个数字应该有多少位数?在您提供的第一个示例中,它始终是 8....
-
@kath 是的,有一种方法:在内存中数字的标准化双精度存储中,第 0 位是符号,第 1-11 位(11 位)是指数,第 12-63 位(52 位)是有效数字。因此,您可以假设手头数字的位数总是 11 位!
-
希望对您有所帮助:
formatC(000101001011, flag = "0", width = 12, format = "d") -
或
sprintf,substr(sprintf("%012d", 000101001011), 1, 4) -
Clemsang 可以继续写一个解决方案,因为他首先评论。基本上它是以不同的方式完成的同一件事。我们也可以使用来自
stringr的str_pad。最初,我不知道字符串的长度是已知的。