假设我有以下本地宏:
loc a = 12.000923
我想获取第一个非零小数(在此示例中为
4
)的小数位。有很多方法可以实现这一目标。一种是将
a
视为字符串,并找到.
的位置:loc a = 12.000923
loc b = strpos(string(`a'), ".")
di "`b'"
从这里开始,由于我得到了第一个非零元素,因此可以进一步遍历小数和计数。当然,这似乎不是一个非常优雅的方法。
您能建议一种更好的方法来解决此问题吗?正则表达式也许?
最佳答案
好吧,我不了解Stata,但是根据documentation,\.(0+)?
被支持,在Stata中转换这2行JavaScript函数应该不难。
它返回第一个非零小数的位置;如果没有小数,则返回-1。
function getNonZeroDecimalPosition(v) {
var v2 = v.replace(/\.(0+)?/, "")
return v2.length !== v.length ? v.length - v2.length : -1
}
说明
我们从输入字符串中删除一个点,后跟可选的连续零。
原始输入字符串的长度与该新字符串的长度之差给出了第一个非零小数的位置
Demo
样本片段
function getNonZeroDecimalPosition(v) {
var v2 = v.replace(/\.(0+)?/, "")
return v2.length !== v.length ? v.length - v2.length : -1
}
var samples = [
"loc a = 12.00012",
"loc b = 12",
"loc c = 12.012",
"loc d = 1.000012",
"loc e = -10.00012",
"loc f = -10.05012",
"loc g = 0.0012"
]
samples.forEach(function(sample) {
console.log(getNonZeroDecimalPosition(sample))
})
关于regex - 查找第一个非零小数的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43479899/