0

为什么我不能在数千之前摆脱空白?

我已经编写了这样的方法来检查字符串是否可以解析为双精度:

编辑:好的,我已经更新了方法,因为每个人都写了相同的答案 - 这是不寻常的情况

public static boolean isNumber(String test) {
    // remove whitespaces
    System.out.print("Test is - " + test);
    test = test.replaceAll("\\s", "");
    // test = test.replaceAll("[ \\t]", "");
    // test = test.replaceAll("\\s+", "");
    // test = test.replaceAll(" ", "");
    System.out.print(" - now test is - " + test);
    // match pattern - numbers with decimal delimiter as dot or comma
    String decimalPattern = "([0-9]*)(\\.|\\,)([0-9]*)";
    boolean match = Pattern.matches(decimalPattern, test);
    System.out.println(" - Is this number? ===> " + match);
    return match;
}

现在我要疯了。这是我的方法的一些输出:

[stdout] Test is - aasdfg - now test is - aasdfg - Is this number? ===> false
[stdout] Test is - aa sd fg - now test is - aasdfg - Is this number? ===> false
[stdout] Test is - 123.50 - now test is - 123.50 - Is this number? ===> true
[stdout] Test is - 123,50 - now test is - 123,50 - Is this number? ===> true
[stdout] Test is - 1 123.50 - now test is - 1 123.50 - Is this number? ===> false

输出的最后一行是奇怪的!

建议 - 测试值来自HSSFCell#getStringCellValue()- 也许这是问题。没有评论的String#replaceAll作品。

4

8 回答 8

3

如果我输入 1 123,你的代码对我有用

为什么不找出字符串的字符?

    for (char c : test.toCharArray())
    {
        System.out.println(0+c);
    }
于 2013-06-27T09:49:11.887 回答
1

由于千位之前的空格是“奇怪的”空格,请尝试以下操作:

test = test.replaceAll("(\\d+)[^\\d.,]+(\\d+)|\\s+", "$1$2");

匹配两个数字之间的任何字符 - 不是数字、点或逗号

于 2013-06-27T10:18:11.150 回答
0

删除空格的常用方法是:

test = test.replaceAll("\\s", "");

并且逗号不是 parseable 的有效字符double。实际上,由于 double 可以表示的最大和最小可能值,并非所有数字组合都是可解析的。

确定字符串是否可以解析为双精度的最简单和最好的方法是尝试解析是使用 JDK:

public static boolean isNumber(String test) {{
    try {
        Double.parseDouble(test.trim());
        return true;
    } catch (NumberFormatException ignore) {
        return false;
    }
}
于 2013-06-27T09:12:05.090 回答
0
String s = stemp.replaceAll("\\s","");
于 2013-06-27T09:12:56.693 回答
0

正如所有人所说,尝试一下 \\s ,这是我的简单检查方法:

public static boolean isStringisDoubleOrNot(String myvalue) {
    try {
        Double.parseDouble(myvalue);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}
于 2013-06-27T09:14:26.590 回答
0

那么这种检查字符串是否可以被解析为双精度的方法呢?

static boolean canBeParsed(String str)
{
    try
    {
        Double.parseDouble(str.trim().replaceAll("\\s",""));
    }
    catch (Exception ignored)
    {
        return false;
    }
    return true;
}

编辑:如果您还想从字符串中删除空格,请使用 .replaceAll("\s","")

于 2013-06-27T09:17:00.897 回答
0

我猜你的变量测试正在被其他线程访问。

使用同步关键字

synchronized(test)
{
     //your complete code
}
于 2013-06-27T09:26:15.903 回答
0

假设我们不知道千位之前到底是什么。它可能是 \n、\t、' ' 或不知道是什么。因此,不要只删除空格,而是尝试只传递数字和点,使用简单的“for循环”并忽略其他所有内容。

StringBuilder sb;
for (int i = 0; i < test.length;  ++i)
     if ((test.charAt(i) >= '0'  &&  test.charAt(i) <= '9')  ||  test.charAt(i) == '.')
        sb.append(test.charAt(i));
于 2013-06-27T09:27:26.217 回答