Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Equals()和indexOf()不作为I';我希望使用NumberFormat_Java_Number Formatting - Fatal编程技术网

Java Equals()和indexOf()不作为I';我希望使用NumberFormat

Java Equals()和indexOf()不作为I';我希望使用NumberFormat,java,number-formatting,Java,Number Formatting,我试图检查一个字符串(筛选器)是否包含在另一个字符串(formattedAmount)中,即筛选器是formattedAmount的子字符串 我无法让它工作,所以我只是将代码改为使用“equals()”而不是“indexOf()”,纯粹是为了简化测试。equals方法似乎也不像我预期的那样有效 下面是我编写的一个虚拟脚本,它复制了我尝试执行的操作: import java.math.BigDecimal; import java.text.NumberFormat; import java.ut

我试图检查一个字符串(筛选器)是否包含在另一个字符串(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语句吗

谢谢

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

一个简单的
println
将揭示真相:分隔符是而不是空格字符:

System.out.println((int)formattedAmount.charAt(3) + " " + (int)filter.charAt(3));
印刷品:

160 32
因此,您的两个字符串不相等

试一试


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

您是否确实尝试打印formattedAmount变量,看看得到了什么?我有Tudor,它会像我预期的那样打印333,44。@Thomas Buckley:我怀疑,第四个字符确实不是空格,而是其他字符。它是什么?它看起来确实像一个空间。它确实看起来像一个空间。虽然如果你检查字符串字节,你会发现它不是与通常空格相同的字符。@Shreder:160是不间断空格,32是正常空格,根据这个:我注意到链接中的字符名是“nbsp”,这似乎是常见的html空格编码。但是当我使用
将网页文本复制+粘贴到java程序中,并将该字符串与我用空格键编写的类似字符串进行比较时,您可能会认为它们不会像我们在这里看到的那样相等,但它们是。。嗯,我想和大家分享一下,为什么XDK浏览器(至少是IE)实际上并没有输出这个“非中断空间”,而只是一个用于
的常规空间。。甚至
 !我想知道为什么;这似乎有误导性。不管怎样,无关紧要的,我不会再胡扯了。(将我的答案添加到您的答案中,如果您愿意,请随时回滚)
char s = 160;
String filter = "333" + s + "333,44";