Equals () и indexOf () не работают, как я ожидаю, используя NumberFormat - PullRequest
5 голосов
/ 25 января 2012

Я пытаюсь проверить, содержится ли строка (фильтр) в другой строке (formattedAmount), то есть является ли фильтр подстрокой formattedAmount.

Я не смог заставить ее работать, поэтому я просто изменил кодиспользовать «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?

Спасибо

Ответы [ 3 ]

10 голосов
/ 25 января 2012

Простое println откроет правду: разделитель тысяч локали ФРАНЦИИ НЕ ПРОБЕЛ :

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

Печать:

160 32

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

Попробуйте

char s = 160;
String filter = "333" + s + "333,44";
2 голосов
/ 25 января 2012

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

0 голосов
/ 25 января 2012

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

...