2012-09-13 14 views
5

tengo una cadena que contiene los valores de moneda mismo formato que 45,890.00 y los valores múltiples separados por comas como 45,890.00,12,345.00,23,765.34,56,908.50 ..valores de moneda dividida cadena por comas

Quiero extraer y procesar todos los valores de la moneda, pero no podía entender la expresión regular correcta para esto, esto es lo que he tratado

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

la salida de este es:

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

¿Podría alguien ayudarme con esto?

+1

¿Quieres decir que quieres recuperar el '.00'? Los valores de entrada deberían usar un mejor delimitador en lugar de usar una coma, lo cual es bastante confuso. – Raptor

+0

Sí ...Quiero los decimales en la salida, no tengo control sobre la cadena de entrada, está siendo alimentado desde una aplicación externa. –

+0

Si no es tarea, quizás tenga más sentido, use 'String.split' para las comas, y' SimpleDecimalFormat' para analizar los valores. Con eso usted puede controlar que es realmente un número, el formato de separador decimal, y luego formatee ese valor decimal de la manera que desee. – helios

Respuesta

11

Usted necesita una expresión regular "mirar hacia atrás" (?<=regex), que coincide, pero que consumen:

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

Así es el caso de test que ahora trabaja:

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

Salida:

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

¡Genial! Funciona, se perdió el "mirar atrás". Aceptará la respuesta en un momento. ¡¡Gracias!! –

3

También podría usar una expresión regular diferente para que coincida con el patrón que está buscando (luego no lo hace) 'T importa realmente lo que el separador es):

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

impresiones

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

explicación de las expresiones regulares:

  • \\d coincide con un dígito
  • \\d{1,3} partidos 1-3 dígitos
  • (\\d{1,3},)? opcionalmente matche s 1-3 dígitos seguidos de una coma.
  • \\. coincide con un punto
  • \\d{2} corresponde a 2 dígitos.

Sin embargo, también diría que tener una coma como separador probablemente no sea el mejor diseño y probablemente genere confusión.

EDIT:

Como @tobias_k señala: \\d{1,3}(,\\d{3})*\\.\\d{2} sería una mejor expresión regular, ya que sería correcto que coincida con:

  • 1,000,000,000.00

y no va a coincidir de forma incorrecta:

  • 1,00.00
+0

Solo quería publicar la misma respuesta, pero con una expresión regular diferente, es decir '' \\ d {1,3} (, \\ d {3}) * \\. \\ d {2} "'. El suyo no coincidirá con valores como "d, ddd, ddd.dd", pero coincidirá con cosas como "dd, dd.dd" –

Cuestiones relacionadas