gpt4 book ai didi

regex - 替换格式化数字中的前导空格

转载 作者:行者123 更新时间:2023-12-04 05:17:31 24 4
gpt4 key购买 nike

我想用 \phantom{...} 替换格式化数字字符串中的前导空格命令,其中 ...与前导空格的长度相同。我能做的是:

x <- c(1, 1., 0.230, 10.1, 1000, 10000.12)
y <- format(round(x, 2), nsmall=2, big.mark="\\\\,", big.interval=3L)
gsub(" ", "\\\\phantom{ }", y)

但是,我宁愿拥有一个 \phantom{}适当长度的(例如 \phantom{ } 然后几个 \phantom{ }

更新

基于Arun的解决方案,我在 R中构建了这个格式化数字的函数在 LaTeX 表中对齐:
tabAlign <- function(x, nsmall=0L, digits=NULL,
flag.before="\\\\phantom{", flag.after="}", embrace="$",
big.mark="\\\\,", big.interval=3L, ...)
{
x <- if(!is.null(digits)) round(x, digits=digits) else x
x <- format(x, nsmall=nsmall, big.mark=big.mark, big.interval=big.interval, ...)
x <- sub("^([ ]+)", paste0(flag.before, "\\1", flag.after), x)
paste0(embrace, x, embrace)
}

现在,让我们用它做一些有用的事情。 tabAlign(x)给出:
[1] "$\\phantom{       }1.00$" "$\\phantom{       }1.00$"
[3] "$\\phantom{ }0.23$" "$\\phantom{ }10.10$"
[5] "$\\phantom{ }1\\,000.00$" "$10\\,000.12$"

将其复制并粘贴到 LaTeX 文件显示对齐方式不正确。原因是 big.mark .本储备 nchar(big.mark)=3空格(在 R 字符串中)。但是,在 LaTeX 中,这占用的空间要少得多,因此数字不再完全对齐。理想情况下, sub()因此命令必须采用 nchar(big.mark)考虑到(对于任何给定的 big.mark )。

更新 2

这是另一个更新,现在考虑到来自 DWin 的提示。
tabAlign <- function(x, nsmall=0L, digits=NULL,
flag="\\\\phantom{\\1}", embrace="$",
big.mark="\\\\,", big.interval=3L, ...)
{
## round (if digits is not NULL)
x <- if(!is.null(digits)) round(x, digits=digits) else x
## determine those with/without big.mark (idea from prettyNum())
y <- format(x, nsmall=nsmall, trim=TRUE)
y.sp <- strsplit(y, ".", fixed=TRUE)
B <- sapply(y.sp, `[`, 1L)
ind.w.big.mark <- grep(paste0("[0-9]{", big.interval+1L, ",}"), B)
ind.wo.big.mark <- setdiff(1:length(y), ind.w.big.mark)
## format the numbers
x <- format(x, nsmall=nsmall, big.mark=big.mark, big.interval=big.interval, ...)
## substitute spaces
z <- character(l <- length(x))
n <- nchar(big.mark)
for(i in seq_len(l)){
z[i] <- if(i %in% ind.wo.big.mark) sub("^([ ]+)", paste0(flag, big.mark), x[i])
else sub("^([ ]+)", flag, x[i])
}
## embrace
paste0(embrace, z, embrace)
}

唯一缺少的部分是不是替换 \phantom 中的所有空格在 if()部分,但只有空格数 - n ,其中 n <- nchar(big.mark) .这如何在 sub() 中指定?

更新 3

这是一个解决方案(但不太优雅......见下文):
tabAlign <- function(x, nsmall=0L, digits=NULL,
flag="\\\\phantom{\\1}", embrace="$",
big.mark="\\\\,", big.mark2="\\,", big.interval=3L, ...)
{
## round (if digits is not NULL)
x <- if(!is.null(digits)) round(x, digits=digits) else x
## determine those with/without big.mark (idea from prettyNum())
y <- format(x, trim=TRUE)
y.sp <- strsplit(y, ".", fixed=TRUE)
B <- sapply(y.sp, `[`, 1L)
w.big.mark <- grep(paste0("[0-9]{", big.interval+1L, ",}"), B)
wo.big.mark <- setdiff(1:length(y), w.big.mark)
## format the numbers
x. <- if(length(wo.big.mark) > 0 && length(w.big.mark) > 0) {
## format but trim
y <- format(x, trim=TRUE, nsmall=nsmall, big.mark=big.mark, big.interval=big.interval, ...)
## paste big.mark to all numbers without big.mark
y[wo.big.mark] <- paste0(big.mark2, y[wo.big.mark])
format(y, justify="right")
} else { # either all numbers have big.mark or not
format(x, nsmall=nsmall, big.mark=big.mark, big.interval=big.interval, ...)
}
z <- sub("^([ ]+)", flag, x.)
## embrace
paste0(embrace, z, embrace)
}

x <- c(1, 1., 0.230, 10.1, 1000, 10000.12)
tabAlign(x)
tabAlign(x[1:4])
tabAlign(x[5:6])

如果我们只能指定 big.mark 会更好(也不是 big.mark2)。

最佳答案

这能解决问题吗?显示所需的输出会很好(在测试表达式时确保输出)。感谢 DWin 的建议(见评论)。

sub("^([ ]+)", "\\\\phantom{\\1}", y)
()捕获匹配的模式(从字符串的开头开始的一堆连续的空格),这个捕获的组可以插入 \\1 .如果您有多个括号,那么您可以通过从\1 到\9 的反向引用插入每个捕获的组。

关于regex - 替换格式化数字中的前导空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14077014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com