2013-06-27 39 views
0

爲什麼我無法在數千人之前擺脫空白?如何用正則表達式在數千之前刪除空格? - 不尋常

我已經寫了這樣的方法來檢查,如果字符串可以解析爲double:

編輯:好的,因爲每個人都寫了同樣的答案我已經更新的方法 - 這是不尋常的情況

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的作品。

+0

你的代碼應該work..where是你的'test'變量聲明..它被其他線程訪問 – Anirudha

+1

我會簡化一切。 1)改變你的程序,使它不會從電子表格中獲取數據,但「1 123.50」是硬編碼的。它工作嗎?如果確實如此2)從電子表格中讀取值,但只包含該值並且沒有空格的值,所以不要替換東西,只是匹配。它工作嗎?如果是這樣的話3)現在在電子表格中具有單個值,但是具有需要剝離的空間...等等。繼續使它更復雜,直到你達到它打破的地步。它聽起來像另一個線程正在改變價值,或者有一個編碼問題... –

+0

@Disco 3 1) - 硬編碼的作品 - 我意識到這一點,並測試2)在數千之前沒有空間(所以變量少於1000 )作品 - 所以3)它不是線程,但可能編碼 - 請看看彼得克羅蒂的回答 – robson

回答

1

由於空格(S)前成千上萬的(是) 「奇怪」 的空格上,試試這個:

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

Matches any character - that are not a digit, a dot or a comma - between two digits

+0

這解決了我的問題,謝謝:-) – robson

0

刪除空白的常用方法是:

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

和逗號不是可解析double有效的字符。實際上,由於double可以表示的最大和最小可能值,因此並非所有的數字組合都可以解析。

確定爲雙是嘗試使用JDK來分析,如果一個字符串可以解析最簡單,最好的方法:

public static boolean isNumber(String test) {{ 
    try { 
     Double.parseDouble(test.trim()); 
     return true; 
    } catch (NumberFormatException ignore) { 
     return false; 
    } 
} 
+1

請看看我的方法 - 和評論線 - 這是我的一個嘗試,也不工作:-( – robson

+0

請參閱我的評論對於Baadshah回答 – robson

0
String s = stemp.replaceAll("\\s",""); 
+0

這也行不通,請參閱我更新的問題 – robson

0

由於所有的表示,與\\s嘗試,這裏是我的簡單的方法來檢查:

public static boolean isStringisDoubleOrNot(String myvalue) { 
    try { 
     Double.parseDouble(myvalue); 
     return true; 
    } catch (NumberFormatException e) { 
     return false; 
    } 
} 
+0

不幸的是,當123.50的值被用於你的方法時 - 沒問題,但是當1 123.50 - 那麼它返回false請注意我真的不知道什麼字符介於一千到幾百之間 – robson

0

這樣的方法來檢查字符串可以解析爲雙重?

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

編輯:如果您想也是從字符串中刪除空格,使用.replaceAll(「\ S」,「」)

0

我猜你的變量測試正在被其他線程訪問。

使用synchronized關鍵字

synchronized(test) 
{ 
    //your complete code 
} 
+0

不幸的是 - 不起作用 – robson

+0

你怎麼稱呼那個方法,並從那裏撥打 – Anirudha

0

比方說,我們不知道究竟是千前。它可能是\ n,\ t,或者不知道。因此,不要只刪除空格,而是嘗試僅傳遞數字和點,用sinple「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)); 
+0

這是相當危險的 - 因爲它會使編號從例如:123dsf.ds4! – robson

+0

他可以製作一些標記來解析數字之間的所有內容。 –

3

您的代碼工作對我來說,如果我在1 123

鍵入爲什麼不找什麼性格是在你的字符串

for (char c : test.toCharArray()) 
    { 
     System.out.println(0+c); 
    } 
+0

線程不是問題,因爲變量是在本地聲明的(String ** test **)。無論如何,它也被重新分配。 –

+0

好點!你的循環變量2 670,99給出了結果:160 54 55 48 44 57 57.這是什麼意思?前兩個字符爲160? – robson

+2

160是一個非破壞空間。請參閱 - http://stackoverflow.com/questions/1822772/java-regular-expression-to-match-all-whitespace-characters。空白的正則表達式不匹配,因此您需要停止包含它們的電子表格,或者展開正則表達式以將其刪除。在這個線程中有一些建議,比如「\ p {javaWhitespace}」 –

相關問題