2012-01-25 1 views
5

Я пытаюсь проверить, содержится ли строка (фильтр) в другой строке (formattedAmount), то есть фильтрует подстроку formattedAmount.Equals() и indexOf() не работают, как я ожидал бы с помощью NumberFormat

Я не мог заставить его работать, поэтому я просто изменил код, чтобы использовать «equals()» вместо «indexOf()», просто для простого тестирования. Метод equals, похоже, не работает, как я ожидал бы.

Вот фиктивный сценарий я написал, что дублирует то, что я пытаюсь сделать:

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

Любые идеи, почему это не въезжающих заявление If?

Благодаря

+2

Вы действительно попытались напечатать переменную formattedAmount и посмотреть, что вы получаете? – Tudor

+0

У меня есть Тюдор, он печатает 333 333,44, как я ожидал. –

+0

@ Томас Бакли: Как я и подозревал, четвертый персонаж действительно не космос, а что-то еще. – Tudor

ответ

10

Простой println раскроет истину: FRANCE локали тысячи Сепаратор НЕ ПРОСТРАНСТВО ХАРАКТЕР:

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

Печать:

160 32 

Следовательно, ваши две строки не равны.

Попытка

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

Что это? Это похоже на пространство. –

+0

Он был действительно похож на пространство. Хотя если вы проверите строковые байты, вы увидите, что это не тот же символ, что и обычный пробел. –

+2

@ Шредер: 160 - Нераскрытое пространство, 32 - Нормальное пространство, в соответствии с этим: http://htmlhelp.com/reference/charset/iso160-191.html – Tudor

2

Строка # равно лексикографически сравнивает две строки. Таким образом, для равных значений true true обе строки должны иметь одинаковый контент. Только что проверили, что две строки имеют разные символы: formattedAmount = 33 33 33 c2 a0 33 33 33 2c 34 34 vs filter = 33 33 33 33 33 33 2c 34 34. 0x20 - это стандартное пространство, а 0xc2a0, вероятно, нет разрывов пространства. Неудивительно, что return false false - строки после разных трех «трех» строк имеют разные символы.

0

nf.format выводит неразрывный пробел (код символа 160) между группами 3-х. У вашего фильтра есть регулярное пространство (код символа 32), поэтому строки не совпадают.