Skip to content

Commit 58652e8

Browse files
committed
#11 parte da secao sobre NumberFormat
1 parent 45cafad commit 58652e8

File tree

7 files changed

+256
-0
lines changed

7 files changed

+256
-0
lines changed

book/03-localization/sections/04-formats.asc

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,106 @@ O exame de certificação compreende quatro classes principais de formatação:
2020
* `DateFormat` -> Formatação de data e hora antes do Java 8.
2121

2222
==== NumberFormat
23+
24+
. É possível obter uma instância de `NumberFormat` a partir de vários métodos estáticos, dependendo da necessidade.
25+
+
26+
[source,java,indent=0]
27+
.{java-package}/formats/NumberFormat_Instance.java
28+
----
29+
include::{section-java-package}/formats/NumberFormat_Instance.java[tag=code]
30+
----
31+
+
32+
Lembre-se que, se não for informado o `Locale`, será utilizado o padrão. O ideal é sempre informar o `Locale`.
33+
34+
. O `NumberFormat` por ser utilizado para transformar números em Strings.
35+
+
36+
[source,java,indent=0]
37+
.{java-package}/formats/NumberFormat_NumberToString.java
38+
----
39+
include::{section-java-package}/formats/NumberFormat_NumberToString.java[tag=code]
40+
----
41+
+
42+
.Saída no console
43+
[source,console]
44+
----
45+
pt_BR: 1.000,05
46+
en_US: 1,000.05
47+
----
48+
+
49+
Perceba que a representação do número muda de acordo com o `Locale`.
50+
51+
. O `NumberFormat` por ser utilizado para transformar Strings em números.
52+
+
53+
[source,java,indent=0]
54+
.{java-package}/formats/NumberFormat_StringToNumber.java
55+
----
56+
include::{section-java-package}/formats/NumberFormat_StringToNumber.java[tag=code]
57+
----
58+
+
59+
.Saída no console
60+
[source,console]
61+
----
62+
pt_BR: 1000.05
63+
en_US: 100005
64+
----
65+
+
66+
Perceba que dependendo do `Locale`, estamos representando um número diferente, e isso muda o resultado do parse.
67+
68+
. O `NumberFormat` por ser utilizado para transformar Strings em valores monetários, e vice-versa.
69+
+
70+
[source,java,indent=0]
71+
.{java-package}/formats/NumberFormat_Currency.java
72+
----
73+
include::{section-java-package}/formats/NumberFormat_Currency.java[tag=code]
74+
----
75+
+
76+
.Saída no console
77+
[source,console]
78+
----
79+
pt_BR: R$ 1.000,05
80+
en_US: $1,000.05
81+
pt_BR: 1000.05
82+
Unparseable number: "R$ 1000,05"
83+
----
84+
+
85+
Perceba que novamente o resultado muda de acordo com o `Locale`. Além disso, não é possível converter a representação da moeda brasileira com um `Locale en_US`.
86+
87+
. O `NumberFormat` por ser utilizado para transformar Strings em percentuais, e vice-versa.
88+
+
89+
[source,java,indent=0]
90+
.{java-package}/formats/NumberFormat_Percent.java
91+
----
92+
include::{section-java-package}/formats/NumberFormat_Percent.java[tag=code]
93+
----
94+
+
95+
.Saída no console
96+
[source,console]
97+
----
98+
pt_BR: 90%
99+
en_US: 90%
100+
pt_BR: 0.8
101+
en_US: 0.8
102+
----
103+
+
104+
Veja que, ao formatar, `100%` é `1`, logo `80%` é `0,8`.
105+
106+
. O `NumberFormat` pode ficar complicado ao lidar com vírgulas.
107+
+
108+
[source,java,indent=0]
109+
.{java-package}/formats/NumberFormat_Percent2.java
110+
----
111+
include::{section-java-package}/formats/NumberFormat_Percent2.java[tag=code]
112+
----
113+
+
114+
.Saída no console
115+
[source,console]
116+
----
117+
pt_BR: 0.802
118+
en_US: 8.02
119+
----
120+
+
121+
No `Locale pt_BR`, temos o resultado esperado. Porém, no `Locale en_US` o `80,2%` se torna `802%`, pois a vírgula não é usada como separador de decimal.
122+
23123
==== DecimalFormat
24124
==== DateTimeFormatter
25125
==== DateFormat
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.j6toj8.localization.formats;
2+
3+
import java.text.NumberFormat;
4+
import java.text.ParseException;
5+
import java.util.Locale;
6+
7+
public class NumberFormat_Currency {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
NumberFormat currencyFormatPtBR = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
12+
NumberFormat currencyFormatEnUS = NumberFormat.getCurrencyInstance(new Locale("en", "US"));
13+
14+
// Valor monetário para String
15+
double d = 1000.05;
16+
17+
System.out.println("pt_BR: " + currencyFormatPtBR.format(d));
18+
System.out.println("en_US: " + currencyFormatEnUS.format(d));
19+
20+
// String para valor Monetário
21+
String s = "R$ 1000,05";
22+
23+
try {
24+
System.out.println("pt_BR: " + currencyFormatPtBR.parse(s));
25+
System.out.println("en_US: " + currencyFormatEnUS.parse(s));
26+
} catch (ParseException e) {
27+
System.out.println(e.getMessage());
28+
}
29+
// end::code[]
30+
}
31+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.j6toj8.localization.formats;
2+
3+
import java.text.NumberFormat;
4+
import java.util.Locale;
5+
6+
public class NumberFormat_Instance {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
// sem Locale
11+
NumberFormat instance1 = NumberFormat.getInstance();
12+
NumberFormat instance2 = NumberFormat.getNumberInstance(); // igual a getInstance()
13+
NumberFormat instance3 = NumberFormat.getCurrencyInstance();
14+
NumberFormat instance4 = NumberFormat.getPercentInstance();
15+
16+
// com Locale
17+
NumberFormat instance5 = NumberFormat.getInstance(new Locale("pt", "BR"));
18+
NumberFormat instance6 = NumberFormat.getNumberInstance(new Locale("pt", "BR"));
19+
NumberFormat instance7 = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
20+
NumberFormat instance8 = NumberFormat.getPercentInstance(new Locale("pt", "BR"));
21+
// end::code[]
22+
}
23+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.j6toj8.localization.formats;
2+
3+
import java.text.NumberFormat;
4+
import java.util.Locale;
5+
6+
public class NumberFormat_NumberToString {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
NumberFormat numberFormatPtBR = NumberFormat.getInstance(new Locale("pt", "BR"));
11+
NumberFormat numberFormatEnUS = NumberFormat.getInstance(new Locale("en", "US"));
12+
13+
double d = 1000.05;
14+
15+
System.out.println("pt_BR: " + numberFormatPtBR.format(d));
16+
System.out.println("en_US: " + numberFormatEnUS.format(d));
17+
// end::code[]
18+
}
19+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.j6toj8.localization.formats;
2+
3+
import java.text.NumberFormat;
4+
import java.text.ParseException;
5+
import java.util.Locale;
6+
7+
public class NumberFormat_Percent {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
NumberFormat percentFormatPtBR = NumberFormat.getPercentInstance(new Locale("pt", "BR"));
12+
NumberFormat percentFormatEnUS = NumberFormat.getPercentInstance(new Locale("en", "US"));
13+
14+
// Percentual para String
15+
double d = 0.9;
16+
17+
System.out.println("pt_BR: " + percentFormatPtBR.format(d));
18+
System.out.println("en_US: " + percentFormatEnUS.format(d));
19+
20+
// String para Percentual
21+
String s = "80%";
22+
23+
try {
24+
System.out.println("pt_BR: " + percentFormatPtBR.parse(s));
25+
System.out.println("en_US: " + percentFormatEnUS.parse(s));
26+
} catch (ParseException e) {
27+
// trate a exceção de parse
28+
}
29+
// end::code[]
30+
}
31+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.j6toj8.localization.formats;
2+
3+
import java.text.NumberFormat;
4+
import java.text.ParseException;
5+
import java.util.Locale;
6+
7+
public class NumberFormat_Percent2 {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
NumberFormat percentFormatPtBR = NumberFormat.getPercentInstance(new Locale("pt", "BR"));
12+
NumberFormat percentFormatEnUS = NumberFormat.getPercentInstance(new Locale("en", "US"));
13+
14+
// String para Percentual
15+
String s = "80,2%";
16+
17+
try {
18+
System.out.println("pt_BR: " + percentFormatPtBR.parse(s));
19+
System.out.println("en_US: " + percentFormatEnUS.parse(s));
20+
} catch (ParseException e) {
21+
// trate a exceção de parse
22+
}
23+
// end::code[]
24+
}
25+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.j6toj8.localization.formats;
2+
3+
import java.text.NumberFormat;
4+
import java.text.ParseException;
5+
import java.util.Locale;
6+
7+
public class NumberFormat_StringToNumber {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
NumberFormat numberFormatPtBR = NumberFormat.getInstance(new Locale("pt", "BR"));
12+
NumberFormat numberFormatEnUS = NumberFormat.getInstance(new Locale("en", "US"));
13+
14+
String s = "1000,05";
15+
16+
try {
17+
Number parsePtBR = numberFormatPtBR.parse(s);
18+
Number parseEnUS = numberFormatEnUS.parse(s);
19+
20+
System.out.println("pt_BR: " + parsePtBR);
21+
System.out.println("en_US: " + parseEnUS);
22+
} catch (ParseException e) {
23+
// trate a exceção no parse
24+
}
25+
// end::code[]
26+
}
27+
}

0 commit comments

Comments
 (0)