diff options
author | Keith Packard <keithp@keithp.com> | 2018-10-07 14:49:48 -0600 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2018-10-07 14:55:35 -0600 |
commit | 173e72429fb494ea3832e3e38ee90f165fbff4cf (patch) | |
tree | e0a703b5de5a888ad58cfa5cfd9614ea86636d67 | |
parent | 1b53a54b032c21b6e8ffb085aa56b9ffdff53d7e (diff) |
altoslib: NumberFormat can't be shared between parsers
AltosJson uses NumberFormat to ensure locale-independent parsing of
values. However, NumberFormat appears to have some internal state
which means that each thread needs to have an independent NumberFormat
object. Create one for each parser as needed.
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | altoslib/AltosJson.java | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/altoslib/AltosJson.java b/altoslib/AltosJson.java index 190d2633..b981c365 100644 --- a/altoslib/AltosJson.java +++ b/altoslib/AltosJson.java @@ -63,18 +63,22 @@ class JsonUtil { result.append("\t"); return result; } - static NumberFormat get_nf_json() { - DecimalFormat nf = (DecimalFormat) NumberFormat.getNumberInstance(Locale.ROOT); - nf.setParseIntegerOnly(false); - nf.setGroupingUsed(false); - nf.setMaximumFractionDigits(17); - nf.setMinimumFractionDigits(0); - nf.setMinimumIntegerDigits(1); - nf.setDecimalSeparatorAlwaysShown(false); - return nf; - } - - static NumberFormat nf_json = get_nf_json(); + + NumberFormat _nf_json; + + NumberFormat nf_json() { + if (_nf_json == null) { + DecimalFormat nf = (DecimalFormat) NumberFormat.getNumberInstance(Locale.ROOT); + nf.setParseIntegerOnly(false); + nf.setGroupingUsed(false); + nf.setMaximumFractionDigits(17); + nf.setMinimumFractionDigits(0); + nf.setMinimumIntegerDigits(1); + nf.setDecimalSeparatorAlwaysShown(false); + _nf_json = nf; + } + return _nf_json; + } } class JsonHash extends JsonUtil { @@ -372,7 +376,7 @@ class JsonLexer extends JsonUtil { String dstr = dbuf.toString(); double dval; try { - dval = nf_json.parse(dstr).doubleValue(); + dval = nf_json().parse(dstr).doubleValue(); } catch (ParseException pe) { return new JsonToken(JsonToken._error, dstr); } @@ -612,7 +616,7 @@ public class AltosJson extends JsonUtil { } else if (Double.isNaN(d_number)) { result.append("NaN"); } else { - String dval = nf_json.format(d_number); + String dval = nf_json().format(d_number); if (dval.equals("-0")) dval = "0"; result.append(dval); |