我正在尝试检查字符串(过滤器)是否包含在另一个字符串(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语句?
由于
答案 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),因此字符串不匹配。