Equals()和indexOf()不能像我期望的那样使用NumberFormat

时间:2012-01-25 17:28:07

标签: java number-formatting

我正在尝试检查字符串(过滤器)是否包含在另一个字符串(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 个答案:

答案 0 :(得分: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 :(得分:2)

String#equals按字典顺序比较两个字符串。因此,对于等于返回true,两个字符串必须具有相同的内容。 只检查两个字符串是否有不同的字符:formattedAmount = 33 33 33 c2 a0 33 33 33 2c 34 34 vs filter = 33 33 33 20 33 33 33 2c 34 34。 0x20是标准空间,0xc2a0可能是无中断空间。 难怪等于返回false - 字符串在前三个'3'之后具有不同的字符。

答案 2 :(得分:0)

nf.format正在输出3组之间的非中断空格(字符代码160)。您的过滤器中有一个常规空格(字符代码32),因此字符串不匹配。