我需要在Groovy中创建一个函数,该函数以一个整数作为参数,并返回它所包含的有效位数



长话短说,我在一个只在其表达式编辑器中使用groovy的系统中工作,我需要创建一个函数,返回一个整数的有效位数。我在Java的堆栈溢出中发现了以下函数,但groovy(或系统本身(似乎不喜欢regex:

String myfloat = "0.0120";
String [] sig_figs = myfloat.split("(^0+(\.?)0*|(~\.)0+$|\.)");
int sum = 0;
for (String fig : sig_figs)
{
sum += fig.length();
}
return sum;

从那以后,我尝试将其转换为一种更Groovy风格的语法以实现兼容,并生成了以下内容:

def sum = 0;
def myint = toString(mynum);
def String[] sig_figs = myint.split(/[^0+(\.?)0*|(~\.)0+$|\.]/);
for (int i = 0; i <= sig_figs.size();i++)
{
sum += sig_figs[i].length();
}
return(sum); 

注意,"mynum"是方法的参数

还应该注意的是,这个系统对系统中可用的groovy功能几乎没有可见性,因此解决方案可能需要尽可能基本的

如有任何帮助,我们将不胜感激。谢谢

我认为这是您需要的正则表达式:

def num = '0.0120'
def splitted = num.split(/(^0+(.?)0*|(~.)0+$|.)/)
def sf = splitted*.length().sum()

我已经有一段时间没有考虑重要数字了,如果我有错误的想法,很抱歉。但我已经制作了两个正则表达式,它们的组合应该计算表示十进制的字符串中的有效位数(对不起,我不是regex向导(。它不处理逗号,你必须把它们去掉。

第一个正则表达式匹配小数点之前的所有有效数字

([1-9]+d*[1-9]|[1-9]+)

第二个正则表达式匹配小数点后的所有有效数字:

.((d*[1-9]+)+)?

如果将两个匹配项的第一个捕获组的长度相加(如果没有匹配项,则为0(,那么它应该会给出有效位数。

示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SigFigs {
private static final Pattern pattern1 = Pattern.compile("([1-9]+\d*[1-9]|[1-9]+)");
private static final Pattern pattern2 = Pattern.compile("\.((\d*[1-9]+)+)?");
public static int getSignificantFigures(String number) {
int sigFigs = 0;
for (int i=0; i < 2; i++) {
Matcher matcher = (i == 0 ? pattern1 : pattern2).matcher(number);
if (matcher.find()) {
try {
String s = matcher.group(1);
if (s != null) sigFigs += s.length();
} catch (IndexOutOfBoundsException ignored) { }
}
}
return sigFigs;
}

public static void main(String[] args) {
System.out.println(getSignificantFigures("0305.44090")); // 7 sig. figs
}
}

当然,使用两个匹配是次优的(正如我所说,我不是像我提到的那样非常擅长regex(,但它相当健壮且可读性强

最新更新