From c419f2be7a597c85c18764cdd402d34a21241765 Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Mon, 22 Jan 2018 11:22:02 +0100 Subject: [PATCH] Up to random number generation --- .../sd1/CreateCustomNumberFormat.java | 24 ++ .../sd1/GetAvailableLocales.java | 15 ++ .../sd1/GetNumberFormatInstance.java | 18 ++ .../sd1/PolymorphicNumberParsing.java | 26 ++ .../de/hdm_stuttgart/sd1/RandomExample.java | 26 ++ .../de/hdm_stuttgart/sd1/RoundingProblem.java | 34 +++ Doc/Sd1/workingWithNumbers.xml | 254 ++++++++++++++++-- 7 files changed, 377 insertions(+), 20 deletions(-) create mode 100644 Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/CreateCustomNumberFormat.java create mode 100644 Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/GetAvailableLocales.java create mode 100644 Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/GetNumberFormatInstance.java create mode 100644 Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/PolymorphicNumberParsing.java create mode 100644 Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/RandomExample.java create mode 100644 Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/RoundingProblem.java diff --git a/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/CreateCustomNumberFormat.java b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/CreateCustomNumberFormat.java new file mode 100644 index 000000000..4ed8f9c41 --- /dev/null +++ b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/CreateCustomNumberFormat.java @@ -0,0 +1,24 @@ +package de.hdm_stuttgart.sd1; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.util.Locale; + +public class CreateCustomNumberFormat { + + public static void main(String[] args) { + + final DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(Locale.getDefault()); + unusualSymbols.setDecimalSeparator('|'); + unusualSymbols.setGroupingSeparator('^'); + + final String strange = "#,##0.###"; + final DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols); + weirdFormatter.setGroupingSize(4); + + String bizarre = weirdFormatter.format(12345.678); + System.out.println(bizarre); + + } +} diff --git a/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/GetAvailableLocales.java b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/GetAvailableLocales.java new file mode 100644 index 000000000..246f4be9d --- /dev/null +++ b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/GetAvailableLocales.java @@ -0,0 +1,15 @@ +package de.hdm_stuttgart.sd1; + +import java.util.Locale; +import java.util.Scanner; + +public class GetAvailableLocales { + + public static void main(String[] args) { + + System.out.println(Locale.getAvailableLocales().length + " locales available:"); + for (final Locale l: Locale.getAvailableLocales()) { + System.out.println("Locale: " + l.getDisplayLanguage() + "(" + l + ")"); + } + } +} diff --git a/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/GetNumberFormatInstance.java b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/GetNumberFormatInstance.java new file mode 100644 index 000000000..8c6d82801 --- /dev/null +++ b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/GetNumberFormatInstance.java @@ -0,0 +1,18 @@ +package de.hdm_stuttgart.sd1; + +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Locale; + +public class GetNumberFormatInstance { + + public static void main(String[] args) { + + final NumberFormat standard = new DecimalFormat(); // Default locale + System.out.println(standard.format(1234.5678)); + + final NumberFormat de = DecimalFormat.getInstance(Locale.GERMANY); + System.out.println(de.format(1234.5678)); + + } +} diff --git a/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/PolymorphicNumberParsing.java b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/PolymorphicNumberParsing.java new file mode 100644 index 000000000..6f357105a --- /dev/null +++ b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/PolymorphicNumberParsing.java @@ -0,0 +1,26 @@ +package de.hdm_stuttgart.sd1; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; + +public class PolymorphicNumberParsing { + + public static void main(String[] args) { + + final NumberFormat de = NumberFormat.getInstance(Locale.GERMANY); + try { + final Number[] values = { + de.parse("103.234"), + de.parse("400.000,234")}; + + for (final Number n: values) { + System.out.println(n + "(" + n.getClass().getTypeName() + ")"); + } + } catch (ParseException e) { + e.printStackTrace(); + } + } +} diff --git a/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/RandomExample.java b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/RandomExample.java new file mode 100644 index 000000000..d930a381f --- /dev/null +++ b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/RandomExample.java @@ -0,0 +1,26 @@ +package de.hdm_stuttgart.sd1; + +import java.util.Random; +import java.util.Scanner; + +public class RandomExample { + + public static void main(String[] args) { + + + try(final Scanner scanner = new Scanner(System.in)) { + System.out.print("Enter an integer seed:"); + final long seed = scanner.nextLong(); + + Random generator = new Random(seed); + for (int i = 0; i < 10; i++) { + System.out.print(generator.nextBoolean() + " "); + } + } + + } + + + + +} diff --git a/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/RoundingProblem.java b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/RoundingProblem.java new file mode 100644 index 000000000..49798c10a --- /dev/null +++ b/Doc/Sd1/Ref/WorkingWithNumbers/P/src/main/java/de/hdm_stuttgart/sd1/RoundingProblem.java @@ -0,0 +1,34 @@ +package de.hdm_stuttgart.sd1; + +import java.math.BigDecimal; + +public class RoundingProblem { + + public static void main(String[] args) { + f(); + d(); + bd(); + } + + static void f() { + final float result = 0.99f - 0.1f -0.1f -0.1f; + System.out.println(result); + } + static void d() { + final double result = 0.99 - 0.1 -0.1 -0.1; + System.out.println(result); + } + + static void bd() { + final BigDecimal zero_dot_99 = new BigDecimal("0.99"); + final BigDecimal zero_dot_1 = new BigDecimal("0.1"); + + BigDecimal result = zero_dot_99. + subtract(zero_dot_1). + subtract(zero_dot_1). + subtract(zero_dot_1); + + System.out.println(result); + } + +} diff --git a/Doc/Sd1/workingWithNumbers.xml b/Doc/Sd1/workingWithNumbers.xml index 630dc0ff2..e16e22e82 100644 --- a/Doc/Sd1/workingWithNumbers.xml +++ b/Doc/Sd1/workingWithNumbers.xml @@ -21,12 +21,12 @@ of integer values</title> <informaltable border="0"> - <colgroup width="83%"/> + <colgroup width="87%"/> - <colgroup width="17%"/> + <colgroup width="13%"/> <tr> - <td valign="top"><programlisting language="java">final Stack<Integer> values = new Stack<>(); + <td valign="top"><programlisting language="java">final Stack<Integer> values = new Stack<>(); values.push(3); values.push(1); @@ -91,7 +91,7 @@ values.push(1); values.push(10); while (!values.empty()) { - System.out.println(values.pop(). + System.out.println(values.pop(). getClass().getTypeName()); }</programlisting></td> @@ -205,9 +205,7 @@ int iPrimitiveFromInteger = <co linkends="sd1_numbers_fig_conventional-3" </informaltable> <figure xml:id="sd1_numbers_fig_stackBoxUnboxVsConventional"> - <title><classname - xlink:href="https://docs.oracle.com/javase/9/docs/api/java/util/Stack.html">Stack</classname> - usage comparison</title> + <title>Boxing syntax comparison</title> <informaltable border="0"> <colgroup width="50%"/> @@ -223,7 +221,8 @@ values.push(Integer.valueOf(1)); values.push(Integer.valueOf(10)); while (!values.empty()) { - System.out.println(values.pop().intValue()); + System.out.println(values.pop(). + intValue()); }</programlisting></td> <td valign="top"><programlisting language="java">final Stack<Integer> values = @@ -234,7 +233,7 @@ values.push(1); values.push(10); while (!values.empty()) { - System.out.println(values.pop()); + System.out.println(values.pop()); }</programlisting></td> </tr> </informaltable> @@ -245,7 +244,7 @@ while (!values.empty()) { <title>Number Parsing</title> <figure xml:id="sd1_numbers_fig_parseIntegerString"> - <title> Parsing <classname + <title>Parsing <classname xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/Integer.html">Integer</classname> user input</title> @@ -344,10 +343,12 @@ not an integer.</screen></td> <colgroup width="50%"/> <tr> - <td valign="top"><programlisting language="java">final int value = Integer.parseInt("1101", 2); -System.out.println("Value: " + value);</programlisting><screen>Value: 13</screen></td> + <td valign="top"><programlisting language="java">final int value = + Integer.parseInt("1101", 2); +System.out.println("Value: " + value); </programlisting><screen>Value: 13</screen></td> - <td valign="top"><programlisting language="java">final int value = Integer.parseInt("201", 2); + <td valign="top"><programlisting language="java">final int value = + Integer.parseInt("201", 2); System.out.println("Value: " + value)</programlisting><screen>Exception in thread "main" java.lang.NumberFormatException: For input string: "201" @@ -580,7 +581,118 @@ Exception in thread "main" java.lang.NumberFormatException: <section xml:id="sd1_numbers_sect_NumberFormatting"> <title>Number Formatting</title> - <para/> + <figure xml:id="sd1_numbers_fig_locale"> + <title>Excerpt from <classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/util/Locale.html">java.util.Locale</classname></title> + + <para>A Locale object represents a specific geographical, political, or + cultural region.</para> + + <para>An operation that requires a Locale to perform its task is called + locale-sensitive and uses the Locale to tailor information for the + user.</para> + + <para>For example, displaying a number is a locale-sensitive operation— + the number should be formatted according to the customs and conventions + of the user's native country, region, or culture.</para> + </figure> + + <figure xml:id="sd1_numbers_fig_localeProperties"> + <title><classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/util/Locale.html">Locale</classname> + properties</title> + + <itemizedlist> + <listitem> + <para>Language</para> + </listitem> + + <listitem> + <para>Encoding</para> + </listitem> + + <listitem> + <para>Country</para> + </listitem> + + <listitem> + <para>Extensible</para> + </listitem> + </itemizedlist> + </figure> + + <figure xml:id="sd1_numbers_fig_constructNumberFormat"> + <title>Get a <classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/text/NumberFormat.html">NumberFormat</classname> + instance</title> + + <programlisting language="java">final NumberFormat standard = new DecimalFormat(); +System.out.println(standard.format(1234.5678)); + +final NumberFormat de = DecimalFormat.getInstance(Locale.GERMANY); +System.out.println(de.format(1234.5678));</programlisting> + + <screen>1,234.568 +1.234,568</screen> + </figure> + + <figure xml:id="sd1_numbers_fig_customFormat"> + <title>Create a custom formatter</title> + + <programlisting language="java">final DecimalFormatSymbols unusualSymbols = + new DecimalFormatSymbols(Locale.getDefault()); +unusualSymbols.setDecimalSeparator('|'); +unusualSymbols.setGroupingSeparator('^'); + +final String strange = "#,##0.###"; +final DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols); +weirdFormatter.setGroupingSize(4); + +System.out.println(weirdFormatter.format(12345.678));</programlisting> + + <screen>1^2345|678</screen> + </figure> + + <qandaset defaultlabel="qanda" + xml:id="sd1_numbers_qanda_getAvailableLocales"> + <title><classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/util/Locale.html">Locale</classname> + definitions</title> + + <qandadiv> + <qandaentry> + <question> + <para>Each <xref linkend="glo_JRE"/> ships with a set of available + <classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/util/Locale.html">Locale</classname> + definitions. Write a simple program to get the following + list:</para> + + <screen>160 locales available: +Locale: Arabic(ar_AE) +Locale: Arabic(ar_JO) +Locale: Arabic(ar_SY) +Locale: Croatian(hr_HR) +... +Locale: Indonesian(in_ID) +Locale: English(en_GB)</screen> + + <tip> + <para>Read the documentation of <classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/util/Locale.html">Locale</classname> + to find appropriate methods.</para> + </tip> + </question> + + <answer> + <programlisting language="java">System.out.println(Locale.getAvailableLocales().length + " locales available:"); +for (final Locale l: Locale.getAvailableLocales()) { + System.out.println("Locale: " + l.getDisplayLanguage() + "(" + l + ")"); +}</programlisting> + </answer> + </qandaentry> + </qandadiv> + </qandaset> <qandaset defaultlabel="qanda" xml:id="sd1_numbers_qanda_formatIntDoubleDate"> @@ -733,23 +845,125 @@ static public void print(final LocalDate date, final Locale locale) { </qandaentry> </qandadiv> </qandaset> - </section> - <section xml:id="sd1_numbers_sect_java.lang.Math"> - <title>The java.lang.Math Class</title> + <figure xml:id="sd1_numbers_fig_polymorphicNumberParsing"> + <title>Polymorphic number parsing</title> + + <programlisting language="java">final NumberFormat de = NumberFormat.getInstance(Locale.GERMANY); +try { + final Number[] values = { + de.parse("103.234"), + de.parse("400.000,234")}; + + for (final Number n: values) { + System.out.println(n + "(" + n.getClass().getTypeName() + ")"); + } +} catch (ParseException e) { + e.printStackTrace(); +}</programlisting> - <para/> + <screen>103234(java.lang.Long) +400000.234(java.lang.Double)</screen> + </figure> </section> <section xml:id="sd1_numbers_sect_WorkingwithMoney"> <title>Working with Money</title> - <para/> + <figure xml:id="sd1_numbers_fig_floatLimitedPreceision"> + <title>Limited <code language="java">float</code> precision</title> + + <programlisting language="java">final float result = 0.99f - 0.1f -0.1f -0.1f; +System.out.println(result);</programlisting> + + <screen>0.68999994</screen> + </figure> + + <figure xml:id="sd1_numbers_fig_doubleLimitedPreceision"> + <title>Limited <code language="java">double</code> precision</title> + + <programlisting language="java">final double result = 0.99 - 0.1 -0.1 -0.1; +System.out.println(result);</programlisting> + + <screen>0.6900000000000001</screen> + </figure> + + <figure xml:id="sd1_numbers_fig_usingBigDecimal"> + <title>Using <classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/math/BigDecimal.html">BigDecimal</classname></title> + + <programlisting language="java">final BigDecimal zero_dot_99 = new BigDecimal("0.99"); +final BigDecimal zero_dot_1 = new BigDecimal("0.1"); + +BigDecimal result = zero_dot_99. + subtract(zero_dot_1). + subtract(zero_dot_1). + subtract(zero_dot_1); + +System.out.println(result);</programlisting> + + <screen>0.69</screen> + </figure> + + <figure xml:id="sd1_numbers_fig_usingBigDecimalFeatures"> + <title><classname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/math/BigDecimal.html">BigDecimal</classname> + features</title> + + <itemizedlist> + <listitem> + <para>Higher memory allocation hosting higher precision.</para> + </listitem> + + <listitem> + <para>Immutable instances</para> + </listitem> + + <listitem> + <para>Calculation performance penalty.</para> + </listitem> + + <listitem> + <para>Clumsy interface.</para> + </listitem> + </itemizedlist> + </figure> </section> <section xml:id="sd1_numbers_sect_GeneratingRandomNumbers"> <title>Generating Random Numbers</title> - <para/> + <figure xml:id="sd1_numbers_fig_random"> + <title>Using <methodname + xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/Math.html#random--">static + double random​()</methodname></title> + + <programlisting language="java">for (int i = 0; i < 10; i++) { + System.out.println(Math.random()); +}</programlisting> + + <screen>0.4754286988826202 +0.0060114391743414375 +... +0.9047785351372987 +0.2516070321935864</screen> + </figure> + + <figure xml:id="sd1_numbers_fig_randomSeed"> + <title>Seeding a pseudo random generator</title> + + <programlisting language="java">try(final Scanner scanner = new Scanner(System.in)) { + System.out.print("Enter an integer seed:"); + final long seed = scanner.nextLong(); + + Random generator = new Random(seed); + for (int i = 0; i < 10; i++) { + System.out.print(generator.nextBoolean() + " "); + } +}</programlisting> + + <screen>Enter an integer seed:4237549835735 +false true true true false false false true false true </screen> + </figure> </section> </chapter> -- GitLab