2012-01-25 29 views
5

Tôi đang cố gắng kiểm tra xem chuỗi (bộ lọc) có được chứa trong một chuỗi khác (formattedAmount) tức là lọc chuỗi con được định dạngAmount hay không.Bằng() và indexOf() không hoạt động như tôi mong đợi bằng cách sử dụng NumberFormat

Tôi không thể làm cho nó hoạt động vì vậy tôi chỉ thay đổi mã để sử dụng "bằng()" thay vì "indexOf()", hoàn toàn đơn giản là việc thử nghiệm. Phương thức equals dường như không hoạt động như tôi mong đợi.

Dưới đây là một kịch bản giả tôi đã viết lên mà sao chép những gì tôi đang cố gắng để làm:

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

Bất cứ ý tưởng tại sao nó không được vào báo cáo kết quả Nếu?

Cảm ơn

+2

Bạn đã thực sự cố gắng in biến được định dạngAmount và xem bạn có nhận được gì không? – Tudor

+0

Tôi có Tudor, nó in 333 333,44 như tôi mong đợi. –

+0

@Thomas Buckley: Như tôi nghi ngờ, nhân vật thứ tư thực sự không phải là không gian, mà là một thứ khác. – Tudor

Trả lời

10

Một đơn giản println sẽ tiết lộ sự thật: sự PHÁP Locale giới ngàn được là NOT THE SPACE CHARACTER:

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

Prints:

160 32 

Do đó, hai chuỗi của bạn không bằng nhau.

Hãy thử

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

Nó là gì? Nó chắc chắn trông giống như một không gian. –

+0

Nó chắc chắn trông giống như một không gian. Mặc dù nếu bạn kiểm tra chuỗi byte, bạn sẽ thấy rằng nó không phải là ký tự giống như không gian thông thường. –

+2

@Shredder: 160 là không gian không phá vỡ, 32 là không gian bình thường, theo điều này: http://htmlhelp.com/reference/charset/iso160-191.html – Tudor

2

Chuỗi # bằng từ điển so sánh hai chuỗi. Vì vậy, cho bằng để trả về true cả hai chuỗi phải có nội dung giống nhau. Chỉ cần kiểm tra xem hai chuỗi có các ký tự khác nhau không: được định dạngAmount = 33 33 33 c2 a0 33 33 33 2c 34 34 so với bộ lọc = 33 33 33 33 33 33 2c 34 34. 0x20 là không gian chuẩn và 0xc2a0 có thể là không-break-không gian. Không có thắc mắc bằng trả về false - các chuỗi có các ký tự khác nhau sau ba '3 đầu tiên.

0

nf.format được xuất ra một không gian không bị phá hủy (nhân vật đang 160) giữa các nhóm 3 của. Bộ lọc của bạn có một khoảng trống thông thường trong đó (mã ký tự 32) để các chuỗi không khớp.

Các vấn đề liên quan