1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.frontend.xeditor.validation;
20
21 import java.text.DecimalFormat;
22 import java.text.DecimalFormatSymbols;
23 import java.text.NumberFormat;
24 import java.text.ParseException;
25 import java.util.Locale;
26
27
28
29
30
31
32 public class MCRDecimalConverter {
33
34 private Locale locale = Locale.getDefault();
35
36 public MCRDecimalConverter(String localeID) {
37 this.locale = new Locale(localeID);
38 }
39
40
41
42
43
44
45
46 public Double string2double(String value) {
47 if (hasIllegalCharacters(value)) {
48 return null;
49 }
50
51 NumberFormat nf = NumberFormat.getNumberInstance(locale);
52 if ((nf instanceof DecimalFormat) && hasMultipleDecimalSeparators(value, (DecimalFormat) nf)) {
53 return null;
54 }
55
56 try {
57 return nf.parse(value).doubleValue();
58 } catch (ParseException e) {
59 return null;
60 }
61 }
62
63 private boolean hasMultipleDecimalSeparators(String string, DecimalFormat df) {
64 DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
65 String patternNonDecimalSeparators = "[^" + dfs.getDecimalSeparator() + "]";
66 String decimalSeparatorsLeftOver = string.replaceAll(patternNonDecimalSeparators, "");
67 return (decimalSeparatorsLeftOver.length() > 1);
68 }
69
70 private boolean hasIllegalCharacters(String string) {
71 return !string.matches("[0-9,.]+");
72 }
73 }