Fix behavior for simple double values

This commit is contained in:
Andrii Shvaika 2021-05-27 14:27:31 +03:00
parent 78ae90da7a
commit 16f548d3dd
2 changed files with 12 additions and 2 deletions

View File

@ -229,7 +229,7 @@ public class JsonConverter {
String valueAsString = value.getAsString();
KeyValueProto.Builder builder = KeyValueProto.newBuilder().setKey(key);
var bd = new BigDecimal(valueAsString);
if (bd.stripTrailingZeros().scale() <= 0) {
if (bd.stripTrailingZeros().scale() <= 0 && !isSimpleDouble(valueAsString)) {
try {
return builder.setType(KeyValueType.LONG_V).setLongV(bd.longValueExact()).build();
} catch (ArithmeticException e) {
@ -251,6 +251,10 @@ public class JsonConverter {
}
private static boolean isSimpleDouble(String valueAsString) {
return valueAsString.contains(".") && !valueAsString.contains("E") && !valueAsString.contains("e");
}
public static TransportProtos.ToServerRpcRequestMsg convertToServerRpcRequest(JsonElement json, int requestId) throws JsonSyntaxException {
JsonObject object = json.getAsJsonObject();
return TransportProtos.ToServerRpcRequestMsg.newBuilder().setRequestId(requestId).setMethodName(object.get("method").getAsString()).setParams(GSON.toJson(object.get("params"))).build();
@ -260,7 +264,7 @@ public class JsonConverter {
String valueAsString = value.getAsString();
String key = valueEntry.getKey();
var bd = new BigDecimal(valueAsString);
if (bd.stripTrailingZeros().scale() <= 0) {
if (bd.stripTrailingZeros().scale() <= 0 && !isSimpleDouble(valueAsString)) {
try {
result.add(new LongDataEntry(key, bd.longValueExact()));
} catch (ArithmeticException e) {

View File

@ -53,6 +53,12 @@ public class JsonConverterTest {
Assert.assertEquals(10L, result.get(0).getLongValue().get().longValue());
}
@Test
public void testParseAsDoubleWithZero() {
var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 42.0}"), 0L);
Assert.assertEquals(42.0, result.get(0L).get(0).getDoubleValue().get(), 0.0);
}
@Test
public void testParseAsDouble() {
var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 1.1}"), 0L);