summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahoo-inc.com>2017-02-09 11:12:19 +0100
committerArne H Juul <arnej@yahoo-inc.com>2017-02-09 11:13:14 +0100
commitff12f27c37e3de29ff6dfd207948269573ae0d81 (patch)
tree0440b6b7cf9c53628b3129dbe5f8924841d4e78b /document
parent9e7006beeb29e7c042ee0d07990b605ac2b852ad (diff)
avoid scientific notation in degrees formatting
Diffstat (limited to 'document')
-rw-r--r--document/src/main/java/com/yahoo/document/PositionDataType.java21
-rw-r--r--document/src/test/java/com/yahoo/document/PositionTypeTestCase.java25
2 files changed, 44 insertions, 2 deletions
diff --git a/document/src/main/java/com/yahoo/document/PositionDataType.java b/document/src/main/java/com/yahoo/document/PositionDataType.java
index a2a1c6012a1..816fcd7bdf7 100644
--- a/document/src/main/java/com/yahoo/document/PositionDataType.java
+++ b/document/src/main/java/com/yahoo/document/PositionDataType.java
@@ -7,6 +7,10 @@ import com.yahoo.document.datatypes.Struct;
import com.yahoo.geo.DegreesParser;
import com.yahoo.document.serialization.XmlStream;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+
/**
* @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
*/
@@ -20,6 +24,19 @@ public final class PositionDataType {
private static final Field FFIELD_X = INSTANCE.getField(FIELD_X);
private static final Field FFIELD_Y = INSTANCE.getField(FIELD_Y);
+ private static final DecimalFormat degreeFmt;
+
+ static {
+ degreeFmt = new DecimalFormat("0.0#####", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
+ degreeFmt.setMinimumIntegerDigits(1);
+ degreeFmt.setMinimumFractionDigits(1);
+ degreeFmt.setMaximumFractionDigits(6);
+ }
+
+ static String fmtD(double degrees) {
+ return degreeFmt.format(degrees);
+ }
+
private PositionDataType() {
// unreachable
}
@@ -29,10 +46,10 @@ public final class PositionDataType {
double ns = getYValue(pos).getInteger() / 1.0e6;
double ew = getXValue(pos).getInteger() / 1.0e6;
buf.append(ns < 0 ? "S" : "N");
- buf.append(ns < 0 ? (-ns) : ns);
+ buf.append(fmtD(ns < 0 ? (-ns) : ns));
buf.append(";");
buf.append(ew < 0 ? "W" : "E");
- buf.append(ew < 0 ? (-ew) : ew);
+ buf.append(fmtD(ew < 0 ? (-ew) : ew));
return buf.toString();
}
diff --git a/document/src/test/java/com/yahoo/document/PositionTypeTestCase.java b/document/src/test/java/com/yahoo/document/PositionTypeTestCase.java
index 3fb9c8d3f9e..1e05c46f898 100644
--- a/document/src/test/java/com/yahoo/document/PositionTypeTestCase.java
+++ b/document/src/test/java/com/yahoo/document/PositionTypeTestCase.java
@@ -41,4 +41,29 @@ public class PositionTypeTestCase {
assertEquals("foo.position", PositionDataType.getPositionSummaryFieldName("foo"));
assertEquals("foo.distance", PositionDataType.getDistanceSummaryFieldName("foo"));
}
+
+ @Test
+ public void requireFixedPointFormat() {
+ assertEquals("0.0", PositionDataType.fmtD(0));
+ assertEquals("123.0", PositionDataType.fmtD(123));
+ assertEquals("0.000123", PositionDataType.fmtD(0.000123));
+ assertEquals("0.000001", PositionDataType.fmtD(0.000001));
+ assertEquals("0.0", PositionDataType.fmtD(0.0000004));
+ assertEquals("999.123456", PositionDataType.fmtD(999.1234564));
+
+ Struct val1 = PositionDataType.valueOf(0, 0);
+ assertEquals("N0.0;E0.0", PositionDataType.renderAsString(val1));
+
+ Struct val2 = PositionDataType.valueOf(-1, -1);
+ assertEquals("S0.000001;W0.000001", PositionDataType.renderAsString(val2));
+
+ Struct val3 = PositionDataType.valueOf(123456789, 87654321);
+ assertEquals("N87.654321;E123.456789", PositionDataType.renderAsString(val3));
+
+ Struct val4 = PositionDataType.valueOf(Integer.MIN_VALUE, Integer.MIN_VALUE);
+ assertEquals("S2147.483648;W2147.483648", PositionDataType.renderAsString(val4));
+
+ Struct val5 = PositionDataType.valueOf(Integer.MAX_VALUE, Integer.MAX_VALUE);
+ assertEquals("N2147.483647;E2147.483647", PositionDataType.renderAsString(val5));
+ }
}