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:
public static void main1(String[] a){// 获得作为本地OS的一部分而存放的默认LocaleLocale l = Locale.getDefault();System.out.println("   Language, Country, Variant, Name");System.out.println(" ");System.out.println("Default locale: ");System.out.println("   " + l.getLanguage() + ", " + l.getCountry()+ ", " + ", " + l.getVariant() + ", " + l.getDisplayName());// Locale(language, contury)// Locale.CANADA_FRENCH == Locale(FRENCH, CANADA )l = Locale.CANADA_FRENCH;System.out.println("A predefined locale - Locale.CANADA_FRENCH:");System.out.println("   " + l.getLanguage() + ", " + l.getCountry()+ ", " + ", " + l.getVariant() + ", " + l.getDisplayName());l = new Locale("en", "CN");System.out.println("User defined locale -Locale(\"en\",\"CN\"):");System.out.println("   " + l.getLanguage() + ", " + l.getCountry()+ ", " + ", " + l.getVariant() + ", " + l.getDisplayName());Locale[] s = Locale.getAvailableLocales();System.out.println("Supported locales: ");for (int i = 1; i <= 10; i++){System.out.println("   " + s[i].getLanguage() + ", "+ s[i].getCountry() + ", " + s[i].getVariant() + ", "+ s[i].getDisplayName());}}
  • 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.00

  • 1.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:
    这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux指令类型(一)change指令

一、change指令 chattr chgrp chmod chown chfn chsh chroot 二、ch指令详细介绍 &#xff08;1&#xff09;chattr 全名&#xff1a;change attribute 作用&#xff1a;chattr命令用于改变文件属性 语法&#xff1a;chattr [-RV][-v<版本编号>]…

restful rest_HATEOAS的RESTful服务。 REST:刷新器

restful rest在这篇文章中&#xff0c;我们将介绍有关HATEOAS的RESTful服务的综合文章。 REST&#xff1a;刷新器。 1.简介 “不好了&#xff01; 请&#xff0c;不要再发表有关REST的文章&#xff01;” 你们中的许多人可能会尖叫&#xff0c;这是正确的。 已经出版了太多的…

Unicode® Character Name Index

【0】README 0.1&#xff09; there are unicodes for varients of alphabet a, for that of b, c, or d and so on, please visit http://unicode.org/charts/charindex.html [A] A WITH ACUTE, LATIN CAPITAL LETTER 00C1 A WITH ACUTE, LATIN SMALL LETTER 00E1 A WITH…

java8 hash算法

一、hash算法哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值&#xff0c;这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母&#xff0c;随后的哈希都将产生不同的值。要找到散列为同…

exchanger_如何通过示例在Java中使用Exchanger

exchanger大家好&#xff0c;如果您在并发Java应用程序中工作&#xff0c;那么您可能听说过java.util.concurrent包的Exchanger类。 Java中的Exchanger是Java 1.5中与CountDownLatch &#xff0c; CyclicBarrier和Semaphores一起引入的另一个并发或同步实用程序。 顾名思义&…

Java Enumeration接口与Iterator接口

一、Enumeration接口 Enumeration接口中定义了一些方法&#xff0c;通过这些方法可以枚举&#xff08;一次获得一个&#xff09;对象集合中的元素。 这种传统接口已被迭代器取代&#xff0c;虽然Enumeration 还未被遗弃&#xff0c;但在现在代码中已经被很少使用了。尽管如此&a…

java国际化——日期和时间+排序

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 测试源代码均为原创&#xff0c; 旨在理解 java国际化——日期和时间排序 的基础知识 &#xff1b; 【1】日期和时间 1&#xff09;当格式化日期和时间时&#xff0c;需要考虑4个与 Locale …

jvm 垃圾收集算法_JVM垃圾收集和优化

jvm 垃圾收集算法总览 在对系统进行性能相关问题的故障排除时&#xff0c;内存优化是一个需要深入分析每个系统在内存中存储的内容&#xff0c;存储时间和访问方式的场所。 这篇文章是要对背景信息进行注释&#xff0c;并在此工作中要注意一些要点&#xff0c;这些工作要针对基…

数据库SQL索引

一、索引的意义 表中创建索引&#xff0c;以便更加快速高效地查询数据。 用户无法看到索引&#xff0c;它们只能被用来加速搜索/查询。 注释&#xff1a;更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间&#xff0c;这是由于索引本身也需要更新。因此&#x…

java国际化——消息格式化+文本文件和字符集

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 测试源代码均为原创&#xff0c; 旨在理解 java国际化——消息格式化文本文件和字符集 的基础知识 &#xff1b; 2&#xff09; 由于本文涉及到的源代码都比较简单&#xff0c;所以直接将全…

java 8 新功能详解_Java 8和Java 14之间的新功能

java 8 新功能详解从版本9开始&#xff0c;Java每6个月就有一次新功能&#xff0c;因此很难跟踪这些新更改。 互联网上的大多数信息都描述了最近2个Java版本之间的变化。 但是&#xff0c;如果您的情况与我相似&#xff0c;则说明您使用的不是Java的最新版本&#xff0c;而是使…

Tomcat配置虚拟内存

一、Tomcat启动参数JAVA_OPTS参数说明   -server 启用jdk 的 server 版&#xff1b;   -Xms java 虚拟机初始化时的堆最小内存&#xff1b;   -Xmx java 虚拟机可使用堆的最大内存&#xff1b;   -XX: PermSize 非堆内存永久保留区域   -XX:MaxPermS…

ISO语言代码和国家代码+Locale常量+ISO货币符号

【1】ISO语言代码和国家代码 【2】Locale常量 【3】ISO货币符号

djl和ljl_使用Spring Boot和DJL进行深度学习

djl和ljl总览 这是Spring Boot上的另一篇文章 &#xff0c;该文章将展示如何使用Deep Java Library &#xff08;DJL&#xff09;构建示例Web应用程序&#xff0c; Deep Java Library &#xff08;DJL&#xff09;是Java的开源深度学习库&#xff0c;用于诊断X射线图像上的COVI…

java BigDecimal八种舍入模式

一、BigDecimal介绍java.math.BigDecimal不可变的immutable、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。标度(scale)如果为零或正数&#xff0c;则标度是小数点后的位数。如果为负数&#xff0c;则将该数的非标度值乘以10的…

java国际化——资源包

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 旨在理解 java国际化——资源包 的基础知识 &#xff1b; 2&#xff09; 本文源代码idea 转自&#xff1a; &#xff08;利用properties 文件进行国际化&#xff09;https://docs.oracle.co…

ui自动化测试测试报告_您需要了解的有关UI测试的所有信息

ui自动化测试测试报告让我们从一个问题开始。 用户在网站上进行互动的第一件事是什么&#xff1f; 接口&#xff0c;当然。 网站的外观是在用户身上产生“第一印象”的第一件事。 交互式Web应用程序可以为用户带来成败&#xff0c;这就是为什么越来越多的人选择对其Web应用程序…

Tomcat解决HTTP GET中文乱码

一、中文乱码原因 Tomcat默认是按ISO-8859-1进行URL解码&#xff0c;ISO-8859-1并未包括中文字符&#xff0c;中文字符不能被正确解析了。 二、配置编码 在tomcat的conf/server.xml下的connetor属性中增加URIEncoding或者useBodyEncodingForURI属性 &#xff08;1&#xff0…

NanoHTTPD web server的一个简单荔枝

【0】README 0.1&#xff09;本文旨在演示一个简单荔枝&#xff0c;以说明如何使用 NanoHTTPD web server 和 浏览器访问 该server的效果 -------------------------------------------------------------- App.java public class App extends NanoHTTPD {public App() thr…

throwable_您想了解的所有Throwable

throwable本文是有关异常的教程。 但不是通常的一种。 其中有许多内容可以告诉您异常的含义&#xff0c;如何抛出异常&#xff0c;捕获异常&#xff0c;已检查异常和运行时异常之间的区别&#xff0c;等等。 没有必要了。 这对您来说也很无聊。 如果没有&#xff0c;那么请阅读…