2012-03-26 50 views
2

我有一個字符串包含項目的價格。如何在首先不知道貨幣符號的情況下提取文本中的所有價格。java得到的價格和符號

I got a wristwatch for $500 and i could sell it to a Nigerian for ₦13,000 or to someone in Saudi Arabia for ﷼800 

我如何獲得所有的價格和他們的貨幣符號。

感謝

+1

你嘗試過什麼?這是一個非常小的正則表達式,你只需要一對通配符值。 – 2012-03-26 21:18:36

+1

你似乎知道你需要正則表達式。你試過了嗎?匹配任何允許的貨幣符號和任何直接位於其後面的數字。 – keyser 2012-03-26 21:20:13

+0

@ keyser5053:是的,我可以用正則表達式來做。但是,在我需要像阿富汗阿富汗這樣的符號匹配的情況下,我該怎麼做。我發現很難將其複製到編輯器中。 – Kennedy 2012-03-26 21:28:44

回答

2

有貨幣符號的正則表達式字符類:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

// (incomplete) list of currency symbols, enhance from http://www.unicode.org/charts/PDF/U20A0.pdf 
private static final String CURRENCY_SYMBOLS= "\\p{Sc}\u0024\u060B"; 

public static void main(String[] args) { 
    Pattern p = Pattern.compile("[" +CURRENCY_SYMBOLS + "][\\d,]+"); 

    Matcher m = p.matcher("I got a wristwatch for $500 and i could sell it to a Nigerian for " + 
      "₦13,000 or to someone in Saudi Arabia for ﷼800 or Afghanistan for ؋350"); 

    while (m.find()) { 
     System.out.println(m.group()); 
    } 
} 
} 

//Output is: 
// $500 
// ₦13,000 
// ﷼800 
// ؋350 
+0

我試過它在上面的字符串中工作。但是,不提取價格與拉丁符號例如دج,.د.ب等 – Kennedy 2012-03-26 21:54:32

+0

是的,這很煩人。您將不得不使用所有貨幣符號來增強正則表達式,從其他答案之一 - http://www.unicode.org/charts/PDF/U20A0.pdf爲您提供列表。我會加強上面的代碼來說明。 – sw1nn 2012-03-26 22:12:58

+0

這太好了。我所需要做的就是添加更多貨幣符號。謝謝:D – Kennedy 2012-03-26 22:31:16

1

對於上面的串,首先你可以簡單地解析了空間,那麼如果它們包含的數字得到的結果。

String[] strArr = givenString.split(" "); 
    List<String> result = new ArrayList<String>(); 
    for(String s : strArr){ 
     if(Pattern.compile("[0-9]").matcher(s).find()) 
      result.add(s); 
    } 
1

Java有語法來寫的所有Unicode符號,它可以處理,語法看起來像「\ uffff」

Unicode符號是非常仔細定義的,因此可以找到相關的組。這表示它是一個在正則表達式的統一符號的所有Unicode currency symbols

武裝的名單,你會發現錢在任何地方:-)

regular expressions甲骨文(姓孫)文檔擁有一整套字符類的其包括貨幣。

我不知道哪個版本的Unicode是實際上是實現的。我在Oracle發現的參考文獻是「支持的塊和類別是那些Unicode標準,3.0版」。根據Unicode group是1999年9月,所以這就是我所假設的。

這確實包括GBP£和Euro€所以我很好:-)但它可能不是最新的,儘管人類不會經常發明貨幣。

這會有點乏味,但是您可以用每個字符代碼(每次一個)生成一個字符串,然後測試與正則表達式貨幣符號的匹配,並檢查您特別關心的那些符號是否包含在內。

實際上還有一個問題。不同的國家對小數點使用不同的標誌,有些國家在數量後面加上符號。到目前爲止,我還沒有找到一個很好的解決方案(http://stackoverflow.com/questions/9185793/how-do-i-get-the-currency-symbol-of-a-currency-as-it-would - 它的一個出現)沒有好的答案。

因此,您可能需要在貨幣符號的任一側上查找數字。

2

您可以在字符串中使用\u20a6作爲尼日利亞貨幣,\ufdfc作爲沙特阿拉伯貨幣的字符串,而不是將貨幣符號添加到字符串中。

+1

的爲\ uXXXX符號實際上是一個預處理器指令,編譯前處理,因此只要編譯器而言\ u20a6和₦是等價的。 – sw1nn 2012-03-26 22:25:53

1

我目前的一個小功能工作使用正則表達式來獲得一個字符串中的價格量:

private static String getPrice(String input) 
{ 
    String output = ""; 

    Pattern pattern = Pattern.compile("\\d{1,3}[,\\.]?(\\d{1,2})?"); 
    Matcher matcher = pattern.matcher(input); 
    if (matcher.find()) 
    { 
     output = matcher.group(0); 
    } 

    return output; 
} 

這似乎與小的代價(0,00到999,99)和各種貨幣工作:

$ 12.34 - > 12。34

$ 12,34 - > 12,34

$ 12.00 - > 12.00

$ 12 - > 12

12€ - > 12

12,11€ - > 12, 11

12.999€ - > 12.99

12.9€ - > 12.9

£999.99€ - > 999.99

...