2012-09-13 10 views
5

ho una stringa che contiene i valori di valuta formattato come 45,890.00 e più valori separati da virgola come 45,890.00,12,345.00,23,765.34,56,908.50 ..valuta Valori stringa divisa da una virgola

Voglio estrarre ed elaborare tutti i valori di valuta, ma non riuscivo a capire l'espressione regolare corretta per questo, questo è ciò che ho provato

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); 
    } 
} 

l'uscita di questo è:

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

Qualcuno potrebbe aiutarmi per favore con questo?

+1

Vuoi dire che vuoi avere il '.00' indietro? I valori di input dovrebbero utilizzare un delimitatore migliore invece di usare la virgola, il che è piuttosto confuso. – Raptor

+0

Sì ..Voglio i decimali indietro nell'output, non ho il controllo sulla stringa di input, è alimentato da un'applicazione esterna. –

+0

Se non è compito a casa forse ha più senso usare quindi 'String.split' per le virgole e' SimpleDecimalFormat' per analizzare i valori. Con questo puoi controllare che sia davvero un numero, il formato separatore decimale, e quindi formattare quel valore decimale nel modo desiderato. – helios

risposta

11

Hai bisogno di un espressione regolare "guardare dietro" (?<=regex), che corrisponde, ma che consumano:

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

Ecco il tuo banco di prova ora di lavoro:

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); 
    } 
} 

uscita:

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

Ottimo! Funziona, ha perso il "look dietro". Accetterà la risposta tra un momento. Grazie!! –

3

Puoi anche usare un'espressione regolare diversa per abbinare il modello che stai cercando (quindi non 'T realmente importa quale sia il separatore è):

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()); 
} 

stampe

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

Spiegazione del regex:

  • \\d corrisponde una cifra
  • \\d{1,3} partite 1-3 cifre
  • (\\d{1,3},)? opzionalmente matche s 1-3 cifre seguite da una virgola.
  • \\. corrisponde a un punto
  • \\d{2} corrisponde a 2 cifre.

Tuttavia, vorrei anche dire che avere la virgola come separatore non è probabilmente il miglior design e probabilmente porterebbe alla confusione.

EDIT:

Come @tobias_k sottolinea: \\d{1,3}(,\\d{3})*\\.\\d{2} sarebbe un'espressione regolare meglio, come sarebbe abbinare correttamente:

  • 1,000,000,000.00

e non corrisponderà in modo non corretto:

  • 1,00 00
+0

Volevo solo pubblicare la stessa risposta, ma con una regex diversa, ad esempio "\\ d {1,3} (, \\ d {3}) * \\. \\ d {2}" '. Il tuo non riuscirà ad abbinare valori come "d, ddd, ddd.dd", ma corrisponderà a cose come "dd, dd.dd" –