2012-01-25 8 views
5

Estoy intentando verificar si una cadena (filtro) está contenida en otra cadena (formattedAmount), es decir, está filtrando una subcadena de formattedAmount.Equals() y indexOf() no funcionan como esperaba usando NumberFormat

No pude hacer que funcione, así que acabo de cambiar el código para usar "equals()" en lugar de "indexOf()", simplemente para simplificar las pruebas. El método igual no parece funcionar como yo esperaría tampoco.

Aquí es un guión ficticio escribí que replica lo que yo estoy tratando de hacer:

import java.math.BigDecimal; 
import java.text.NumberFormat; 
import java.util.Locale; 


public class utils 
{ 

    public utils() 
    { 
    } 

    public static void main(String[] args) throws Exception 
    { 
     String filter = "333 333,44"; 
     Number amount = new BigDecimal(333333.44); 

     NumberFormat nf = NumberFormat.getNumberInstance(Locale.FRANCE); 
     nf.setMinimumFractionDigits(2); 

     String formattedAmount = nf.format(amount); 

     if (formattedAmount.equals(filter)) 
     { 
      System.out.println("Working"); 
      } 
    } 
} 

alguna idea de por qué no está entrando en la instrucción If?

Gracias

+2

¿De verdad ha intentado imprimir la variable FormatAmunt y ver qué obtiene? – Tudor

+0

Tengo Tudor, imprime 333 333,44 como era de esperar. –

+0

@Thomas Buckley: Como sospechaba, el cuarto personaje no es espacio, sino algo más. – Tudor

Respuesta

10

Un simple println revelará la verdad: el FRANCE entorno nacional al separador de miles es NO el carácter de espacio:

System.out.println((int)formattedAmount.charAt(3) + " " + (int)filter.charAt(3)); 

Lienzo:

160 32 

Por lo tanto, sus dos cadenas no son iguales.

Trate

char s = 160; 
String filter = "333" + s + "333,44"; 
+1

¿Qué es? Seguro que parece un espacio. –

+0

Seguro que parecía un espacio. Aunque si comprueba los bytes de cadena, verá que no es el mismo carácter que el espacio habitual. –

+2

@Shredder: 160 es espacio sin interrupción, 32 es el espacio normal, de acuerdo con esto: http://htmlhelp.com/reference/charset/iso160-191.html – Tudor

2

Cadena # es igual lexicográfico compara dos cadenas. Entonces, para que los iguales devuelvan verdadero, ambas cadenas deben tener el mismo contenido. Acabo de comprobar que dos cadenas tienen caracteres diferentes: formattedAmount = 33 33 33 c2 a0 33 33 33 2c 34 34 vs filter = 33 33 33 33 33 33 2c 34 34. 0x20 es el espacio estándar y 0xc2a0 es probable no-break-space. No es de extrañar que el resultado sea falso: las cadenas tienen caracteres diferentes después de los primeros 3 '3.

0

nf.format es dar salida a un espacio de no separación (código de carácter 160) entre los grupos de 3 de. Su filtro tiene un espacio regular en él (código de carácter 32) para que las cadenas no coincidan.

Cuestiones relacionadas