2012-05-14 39 views
16

Tôi đang tạo một chương trình Java Android đang lấy giá trị gấp đôi từ người dùng. Nếu tôi chạy chương trình trên máy tính, nó hoạt động rất tốt vì ngôn ngữ của máy tính của tôi, EN_UK. Nhưng khi tôi chạy nó trên điện thoại di động của tôi với miền địa phương FI_FI, nó sẽ không hoạt động. Tôi biết lý do: Ở Anh, người ta sử dụng dấu chấm dưới dạng số thập phân nhưng ở Phần Lan, dấu phẩy thập phân là dấu phẩy.Đôi, dấu phẩy và dấu chấm

DecimanFormat df = new DecimalFormat("#.#"); 
Double returnValue = Double.valueOf(df.format(doublenumber)); 

Khi tôi đang sử dụng dấu phẩy, nó nói java.lang.NumberFormatException: Invalid double: "1234,5".

Tôi làm cách nào để nó hoạt động cùng với cả dấu phẩy và dấu chấm?

+0

Tại sao bạn không chỉ phân tích chuỗi và thay thế các dấu phẩy với dấu chấm nếu cần thiết? – guitarflow

+0

Giải pháp không thông minh là thay thế tất cả các dấu phẩy bằng dấu chấm đầu tiên và sau đó xử lý số như thể nó được định dạng bằng dấu chấm. –

Trả lời

28

Sử dụng một trong các nhà thầu khác của DecimalFormat:

new DecimalFormat("#.#", new DecimalFormatSymbols(Locale.US)) 

Và sau đó thử và phân tích nó sử dụng cả hai dải phân cách.

+1

Đến nay câu trả lời tốt nhất - nếu bạn cần DOT thay vì COMMA, đừng nhìn xa hơn. –

4

sử dụng DecimalFormatSymbols.getInstance() sẽ tạo ra các ký hiệu chính xác của ngôn ngữ mặc định, vì vậy bạn sẽ làm đúng cho bất kỳ nền tảng nào bạn chạy.

DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance()); 
+0

Tương đương với những gì anh ta đang làm. – Jerome

+0

getInstance (Locale.US) – Mikey

+0

Chỉ cần cho bản ghi, bạn cần nhập khẩu này trong tệp Java của bạn: nhập java.text.DecimalFormat; nhập java.text.DecimalFormatSymbols; –

-2
DecimanFormat df = new DecimalFormat("#.#"); 
1
public static Double parseDoubleTL(String value){ 
    DecimalFormat df = new DecimalFormat("#.#", new DecimalFormatSymbols(new Locale("tr_TR"))); 
    Double doublePrice = 0.0; 
    try { 
     doublePrice = df.parse(value).doubleValue(); 
    } catch (ParseException e) { 
     Log.w(MainActivity.TAG,"Couldnt parse TL. Error is "+e.toString()); 
    } 
    return doublePrice; 
} 
0

Không phải là một cách tốt nhất nhưng làm việc cho tôi;

Double val=null; 
    try{ 
     val=Double.valueOf(value); 
    }catch(Exception e){ 
     val=Double.valueOf(value.replace(',','.')); 
    } 
      Double val=null; 
    try{ 
     val=Double.valueOf(value); 
    }catch(Exception e){ 
     val=Double.valueOf(value.replace(',','.')); 
    } 
    return val; 
2

này nên làm việc cho cả Java (Tested) cũng như android :)

  • Tên nhóm: In18Helper.java

    package com.akmeher.app.utils; 
    
    import java.text.NumberFormat; 
    import java.text.ParseException; 
    import java.util.Locale; 
    
    public class In18Helper { 
        private final static In18Helper mHelper = new In18Helper(); 
    
        public static final In18Helper getInstance() { 
         return mHelper; 
        } 
    
        public double getDouble(String sValue, Locale locale) { 
         NumberFormat numberFormat = NumberFormat.getInstance(locale); 
    
         Number parse = null; 
         try { 
          parse = numberFormat.parse(sValue); 
         } catch (ParseException e) { 
          e.printStackTrace(); 
         } 
    
         return parse == null ? 0 : parse.doubleValue(); 
        } 
    
    } 
    
  • Tên nhóm: Ứng dụng .java

    package com.akmeher.app; 
    
    import java.util.Locale; 
    import com.akmeher.app.utils.In18Helper; 
    
    public class Application { 
    
        static DataModel[] testData = new DataModel[] { 
          new DataModel("1.034567", Locale.ENGLISH), 
          new DataModel("1,0345.67", Locale.ENGLISH), 
          new DataModel("1.0345,67", Locale.GERMANY), 
          new DataModel("1,034,567", Locale.CANADA), 
          new DataModel("1.034567", Locale.KOREA), 
          new DataModel("1,03.4567", Locale.ITALY) }; 
    
        /** 
        * @param args 
        */ 
        public static void main(String[] args) { 
    
         for (int i = 0; i < testData.length; i++) { 
            double d = In18Helper.getInstance().getDouble(testData[i].mValue, 
            testData[i].mLocale); 
    
          System.out.println("Trial Value: "+testData[i].mValue+" for Locale: "+testData[i].mLocale+" converted to: "+d); 
         } 
        } 
    
        private static class DataModel { 
         String mValue; 
         Locale mLocale; 
    
         public DataModel(String value, Locale locale) { 
          this.mLocale = locale; 
          this.mValue = value; 
         } 
        } 
    } 
    

Output:

Trial Value: 1.034567 for Locale: en converted to: 1.034567 Trial Value: 1,0345.67 for Locale: en converted to: 10345.67 Trial Value: 1.0345,67 for Locale: de_DE converted to: 10345.67 Trial Value: 1,034,567 for Locale: en_CA converted to: 1034567.0 Trial Value: 1.034567 for Locale: ko_KR converted to: 1.034567 Trial Value: 1,03.4567 for Locale: it_IT converted to: 1.03

Hy vọng điều này sẽ giúp ai đó để tận dụng.

-1

nhớ Lỗi:

java.lang.NumberFormatException: Invalid float: "1,683.88" 

... và tác phẩm này với tôi

replace(",", "") 
Các vấn đề liên quan