2014-10-31 64 views
0

我正在開發一個應用程序,我使用Geocoder來獲取地點的座標。在某些操作中語言是否有條件?

手術是這樣的:

  • 用戶定義的地址。
  • 地理編碼器找到該地址,並從該地址獲取座標。
  • 這個座標是十進制的格式,我需要它們的度數分鐘,所以我格式化它們。所以

    String frmtLatitude = Location.convert(Double.parseDouble(lat), Location.FORMAT_MINUTES); 
    

    ,如果我有例如這個緯度43.249591十進制值,它返回它像這樣43:14.97546

要格式化從十進制度分鐘我用的座標。

在此之後,我必須做出一些行動,最終得到與這個樣子緯度:「」 4314.975

當我做這個業務,其中之一是使用分裂值。我將14.97546拆分爲一手14和另一手97546

直到這裏,一切都好。當我的手機語言選擇爲英語時,它工作正常。但如果我選擇西班牙語,應用程序崩潰。我已經跟蹤了堆棧跟蹤並且指向了那裏。在使用第一個註釋函數從十進制轉換成度 - 分鐘時,就像英文那樣,它將小數與「。」分開。但是如果我用西班牙文製作它,它會將它們與「,」分開。

這真的可以發生,或者原因可能是另一回事嗎?

回答

2

我們可以看看convert方法的源代碼

public static String convert(double coordinate, int outputType) { 
    if (coordinate < -180.0 || coordinate > 180.0 || 
     Double.isNaN(coordinate)) { 
     throw new IllegalArgumentException("coordinate=" + coordinate); 
    } 
    if ((outputType != FORMAT_DEGREES) && 
     (outputType != FORMAT_MINUTES) && 
     (outputType != FORMAT_SECONDS)) { 
     throw new IllegalArgumentException("outputType=" + outputType); 
    } 

    StringBuilder sb = new StringBuilder(); 

    // Handle negative values 
    if (coordinate < 0) { 
     sb.append('-'); 
     coordinate = -coordinate; 
    } 

    DecimalFormat df = new DecimalFormat("###.#####"); 
    if (outputType == FORMAT_MINUTES || outputType == FORMAT_SECONDS) { 
     int degrees = (int) Math.floor(coordinate); 
     sb.append(degrees); 
     sb.append(':'); 
     coordinate -= degrees; 
     coordinate *= 60.0; 
     if (outputType == FORMAT_SECONDS) { 
      int minutes = (int) Math.floor(coordinate); 
      sb.append(minutes); 
      sb.append(':'); 
      coordinate -= minutes; 
      coordinate *= 60.0; 
     } 
    } 
    sb.append(df.format(coordinate)); 
    return sb.toString(); 
} 

我們可以看到它使用與給定模式的DecimalFormat得到它。所以,如果我們放眼DecimalFormat的構造函數:

public DecimalFormat(String pattern) { 
    // Always applyPattern after the symbols are set 
    this.symbols = new DecimalFormatSymbols(Locale.getDefault()); 
    applyPattern(pattern, false); 
} 

我們可以在這裏看到,即使我們給一個模式,它使用的語言環境值。 Javadoc中也說:

參數:

模式非本地化的模式字符串。

要完成,我們就可以去這裏看到的數字代表不同的地方變體:http://docs.oracle.com/cd/E19455-01/806-0169/overview-9/index.html

所以我們可以看到,美國英語使用「點格式」和西班牙使用「逗號格式」 。

要回答你的問題:你面對的proflem可能是由於你的語言環境的十進制格式。我建議你在轉換對象類型以便對它們進行操作時非常小心。將int轉換爲String應該僅用於顯示它。

我認爲,當它劇照浮動(或任何小數類型),你應該獨立你的電話號碼的小數部分,那麼你的對象轉換爲字符串,以顯示它。你可以看看Math類或搜索,以便獲取有關如何這一些示例;)

而且,@Dmitry說,你可以用DecimalFormatSymbols.getDecimalSeparator()得到DecimalSeparator。

來源

Location.convert(double,int) source code

DecimalFormat(String) source code

Java "Decimal and thousands separators"

+0

這實在是詳細的解答。感謝您鏈接到Oracle文檔,這非常有用。我不知道有些語言使用點作爲組分隔符 – Dmitry 2014-10-31 10:46:47

1

你說得對,十進制分隔符取決於你的語言環境。你可以通過這樣的

DecimalFormat df = new DecimalFormat(); 
    DecimalFormatSymbols formatSymbols = df.getDecimalFormatSymbols(); 
    char separator = formatSymbols.getDecimalSeparator(); 
+0

所以,最終的'separator'值將有一個 「」或一個「,」取決於我的區域設置。我怎麼能與'.split()'方法使用它呢? – masmic 2014-10-31 10:31:34

+1

您可以通過代碼得到分隔以上,當然你可以拆分使用它()方法 – Dmitry 2014-10-31 10:34:11

相關問題