2012-09-13 16 views
5

Mam ciąg, który zawiera sformatowany wartości waluty jak 45,890.00 i wielu wartości oddzielonych przecinkiem jak 45,890.00,12,345.00,23,765.34,56,908.50 ..waluty podział ciąg przecinkiem

Chcę wydobyć i przetworzyć wszystkie wartości waluty, ale nie mogliśmy zorientować się, poprawne wyrażenie regularne do tego, to co starałem

public static void main(String[] args) { 
    String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50"; 
    String regEx = "\\.[0-9]{2}[,]"; 
    String[] results = currencyValues.split(regEx); 
    //System.out.println(Arrays.toString(results)); 
    for(String res : results) { 
     System.out.println(res); 
    } 
} 

wyjście to jest:

45,890 //removing the decimals as the reg ex is exclusive 
12,345 
23,765 
56,908.50 

Czy ktoś mógłby mi pomóc z tym?

+1

Masz na myśli, że chcesz odzyskać '.00'? Wartości wejściowe powinny używać lepszego separatora zamiast używania przecinka, co jest dość mylące. – Raptor

+0

Tak ..Chcę, aby ułamki dziesiętne z powrotem na wyjściu, nie mam kontroli nad ciągiem wejściowym, Jest pobierany z zewnętrznej aplikacji. –

+0

Jeśli to nie jest praca domowa, może to ma więcej sensu, więc użyj 'String.split' dla przecinków i' SimpleDecimalFormat', aby przeanalizować wartości. Dzięki temu możesz kontrolować, że to naprawdę liczba, format separatora dziesiętnego, a następnie formatuj tę wartość dziesiętną tak, jak chcesz. – helios

Odpowiedz

11

Trzeba regex "zajrzeć za" (?<=regex), który pasuje, ale nie spożywać:

String regEx = "(?<=\\.[0-9]{2}),"; 

Oto twój przypadek testowy teraz pracuje:

public static void main(String[] args) { 
    String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50"; 
    String regEx = "(?<=\\.[0-9]{2}),"; // Using the regex with the look-behind 
    String[] results = currencyValues.split(regEx); 
    for (String res : results) { 
     System.out.println(res); 
    } 
} 

wyjściowa:

45,890.00 
12,345.00 
23,765.34 
56,908.50 
+0

Świetnie! To działa, brakowało "spojrzenia w tył". Przyjmę odpowiedź za chwilę. Dzięki!! –

3

Można również użyć innego wyrażenia regularnego, aby dopasować wzorzec, który wyszukujesz (wówczas „T naprawdę znaczenia, co jest separator):

String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50,55.00,345,432.00"; 
Pattern pattern = Pattern.compile("(\\d{1,3},)?\\d{1,3}\\.\\d{2}"); 
Matcher m = pattern.matcher(currencyValues); 
while (m.find()) { 
    System.out.println(m.group()); 
} 

drukuje

45,890.00 
12,345.00 
23,765.34 
56,908.50 
55.00 
345,432.00 

wyjaśnienie regex:

  • \\d pasuje cyfra
  • \\d{1,3} mecze 1-3 cyfr
  • (\\d{1,3},)? opcjonalnie matche s 1-3 cyfry, po których następuje przecinek.
  • \\. pasuje do kropki
  • \\d{2} dopasowuje 2 cyfry.

Jednak powiedziałbym również, że przecinek jako separator prawdopodobnie nie jest najlepszym projektem i prawdopodobnie doprowadziłby do zamieszania.

EDIT:

Jak @tobias_k zaznacza: \\d{1,3}(,\\d{3})*\\.\\d{2} byłby lepszym regex, jak to poprawnie dopasować:

  • 1,000,000,000.00

i nie będzie nieprawidłowo pasuje:

  • 1,00,00
+0

Po prostu chciałem opublikować tę samą odpowiedź, ale z innym wyrażeniem regularnym, tj. "\\ d {1,3} (, \\ d {3}) * \\. \\ d {2}" '. Twoje wartości nie będą pasować do wartości takich jak "d, ddd, ddd.dd", ale będą pasować do rzeczy takich jak "dd, dd.dd" –

Powiązane problemy