java国际化——Locale+数字格式
【0】README
1) 本文部分文字描述轉自 core java volume 2 , 測試源代碼均為原創, 旨在理解 java國際化——Locale+數字格式 的基礎知識 ;
2) java 編程語言是第一個設計成為全面支持國際化的語言。
- 2.1)從一開始, 它就具備了進行有效的國際化所必須 的一個重要特性: 使用 Unicode 來處理所有字符串; (干貨——java 使用 Unicode 來處理所有字符串 全面支持國際化)
【1】Locales
1)有若干個專門負責格式處理的類。 為了對格式化進行控制, 可以使用Locale類。它描述了: 一種語言;一個位置;一段腳本(java 7 開始支持);一個變體;
2)看個荔枝:指定諸如方言或拼寫規則之類的雜項, 如,
- 2.1)在美國, Locale 對象包含language=English, location=UnitedStates
- 2.2)瑞士有四種官方語言(德語, 法語, 意大利語和力拓羅曼史語),一個說德語的瑞士人使用的 Locale 是: (干貨——說德語的瑞士人的Locale表示)
langage=German , location = Switzerland ; - 2.3)Locale 有兩個屬性: 表達語言(本地代碼,遵循ISO-639-1)+位置(國家代碼, 遵循ISO-3166-1)
3) 創建Locale 對象:(只要提供了語言代碼或語言與國家代碼), 也就是說至少要提供語言代碼:
Locale german = new Locale(“de”);
Locale germanGermany = new Locale(“de”, “DE”);
Locale germanSwitzerland = new Locale(“de”, “CH”); //說德語的瑞士人;
4)為方便起見,java SE 預定了大量的Locale對象 和 語言Locale:
5)還有其他兩種方法獲得一個 Locale 對象:
- 5.1) Locale類的靜態方法 getdefault 方法:可以獲得作為本地os 的一部分而存放的默認 Locale;
- 5.2)setDefault方法:改變默認的 Locale, 但是,這種改變只對你的程序有效, 不會對os 產生影響;
6)最后, 對于所依賴的Locale 的類,可以返回一個它們所支持的Locale 數組, 如:
Locale[] locales = DateFormat.getAvailabelLocales(); 將返回 所有 DataFormat 類所能夠處理的 Locale ;
Attention)命令行設置 默認 Locale:
java -Duser.languge\=\de -Duser.region=CH MyClass
7)一旦有了 Locale對象,做的事情很有限。
- 7.1)getdisplayName方法:而是以一種面向用戶的形式來表現, 如 German (Switzerland)
- 7.2)problem+solution
- 7.2.1)problem:顯示的名字是默認的 locale 來表示的, 這是不恰當的。 如果你的用戶已經選擇了 德語作為首選語言, 那么你希望用德語顯示字符串;
- 7.2.2)solution: 通過將 GermanLocale 作為參數傳遞就可以做到這一點:
Locale loc = new Locale(“de”, “CH”);
out.println(loc.getDisplayName(Locale.GERMAN)); // 打印出 Deutsch(Schweiz)
8)看個荔枝(測試Locale):
- 8.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter5/LocalesTest.java
- 8.2)key source code at a glance:
- 8.3)relative printing results as follows:
【2】數字格式
1) 數字和貨幣高度依賴于 locale的;
2) java 提供了格式器, 可以對 java.text 包中的 數字值進行格式化和解析;
3)通過如下步驟來對特定 Locale 的數字進行格式化:
- step1)創建 Locale 對象;
step2) 使用工廠方法得到一個格式器對象; 工廠方法是 NumberFormat 類的靜態方法, 它們接收一個 Locale類的參數,總共有3個工廠方法: getNumberInstance, getCurrencyInstance, getPercentInstance , 這些方法返回的對象可以分別用數字, 貨幣量和 百分比進行格式化和解析;
step3) 使用這個格式器對象來完成格式化和解析工作;3.1)看個荔枝: 如何對德語中的貨幣值進行格式化:
Locale locale = new Locale(“de”, “DE”);
NumberFormat format = NumberFormat.getCurrencyInstance(locale);
double amt = 65545454.8976;
string result = format.format(amt);
3.2)看個荔枝: 想要讀取一個按照某個 Locale 的慣用法而輸入或存儲的數字, 使用parse 方法進行解析:
TextField inputField;
…
NumberFormat format = NumberFormat.getNumberInstance();
//get the number formatter for default locale
Number input = format.parse(inputFiled.getText().trim());
double x = input.doubleValue();
對以上代碼的分析(Analysis):
- A1) parse 的返回類型是抽象的 Number 類型;
- A2)返回的對象是一個 Double 或 Long 的包裝器對象, 這取決于被解析的數字是否是浮點數;
- A3)如果不關心兩者的差異, 可以直接使用 Number 類中的 doubleValue 方法來讀取被包裝的數字;
Warning)
- W1) Number 類型的對象并不能自動轉換為 相關的基本類型, 因此不能直接將一個Number 對象賦給一個基本類型, 而應該使用 doubleValue 或 intValue 方法; (干貨——Number 類型的對象并不能自動轉換為 相關的基本類型)
3.3) 如果數字文本的格式不正確,會拋出 ParseException; (干貨——任何跟在數字之后的字符都將被忽略, 所以這些跟在后面的字符是不會引起異常的);
Attention)
- A1) 有 getXXInstance 工廠方法返回的類并非是 NumberFormat 類型的;
- A2) NumberFormat類型是一個抽象類型,而我們實際上得到的格式器是它的一個子類;
- A3)工廠方法只知道如何定位屬于 特定Locale 的對象;
- A4) 可以用靜態的 getAvailableLocales 方法: 得到一個當前所支持的Locale對象列表。 這個方法返回一個Locale 對象數組, 從中可以獲得針對他們的數字格式器對象;
【3】貨幣
1)problem+solution:
1.1)problem: 有一張貨物單,貨單中有些貨物用美元表示,有些用歐元表示, 則,你不能只是使用兩種格式器:
NumberFormat format1 = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat format2 = NumberFormat.getCurrencyInstance(Locale.GERMANY);
//這樣一來,發票會很奇怪。 有些金額的格式是 $100,而另一些如 €100.001.2) solution: 應該使用 Currency 類來控制 被格式器所處理的貨幣。可以通過將一個貨幣識別符傳給靜態的 Currency.getInstance 方法來得到一個 Currency 對象,然后對每個格式器都調用 setCurrency 方法; (干貨——引入貨幣識別符)
2)看個荔枝: 下面展示如何為你的美國客戶設置歐元的格式:
NumberFormat euroFormatter = NumberFormat.getCurrencyInstance(Locale.US);
euroFormatter.setCurrency(Currency.getInstance(“EUR”));
3)貨幣符號是 由 ISO 4217定義的, 如下表所示:
4)看個荔枝(測試Locale):
- 4.1)for souce code, please visit : 同上;
4.2)key source code at a glance:
// 設置貨幣的顯示格式public static void currencyFormatAgain(){double num = 123.456;NumberFormat defaultFormat = NumberFormat.getCurrencyInstance();System.out.println("default: " + defaultFormat.format(num));// 說英語的中國人Locale chinese = new Locale("en", "CN");NumberFormat englishFormat = NumberFormat.getCurrencyInstance(chinese);System.out.println(englishFormat.format(num));}4.3)relative printing results as follows:
總結
以上是生活随笔為你收集整理的java国际化——Locale+数字格式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旋风少女手游电脑版(旋风少女游戏官方手游
- 下一篇: 苹果电脑浏览器死机怎么回事啊(苹果电脑出