You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@olingo.apache.org by "Alexandre Boudnik (JIRA)" <ji...@apache.org> on 2015/10/02 22:25:26 UTC
[jira] [Issue Comment Deleted] (OLINGO-788) Numbers having more
than 17 digits in mantissa can't be parsed
[ https://issues.apache.org/jira/browse/OLINGO-788?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexandre Boudnik updated OLINGO-788:
-------------------------------------
Comment: was deleted
(was: I would like to provide a patch for this:
{code}
Index: lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDoubleTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDoubleTest.java (date 1443555739000)
+++ lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDoubleTest.java (revision )
@@ -93,6 +93,12 @@
assertEquals(Long.valueOf(1234567890), instance.valueOfString("1234567890E-00", null, null, null, null, null,
Long.class));
+ assertEquals(Double.valueOf(0.012345678901234567), instance.valueOfString("0.012345678901234567",
+ null, null, null, null, null, Double.class));
+
+ assertEquals(Double.valueOf(123456789012345600.0), instance.valueOfString("123456789012345600.0",
+ null, null, null, null, null, Double.class));
+
assertEquals(Double.valueOf(Double.NaN), instance.valueOfString("NaN", null, null, null, null, null,
Double.class));
assertEquals(Double.valueOf(Double.NEGATIVE_INFINITY), instance.valueOfString("-INF", null, null, null, null,
Index: lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDouble.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDouble.java (date 1443555739000)
+++ lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDouble.java (revision )
@@ -36,7 +36,8 @@
protected static final String NaN = "NaN";
private static final Pattern PATTERN = Pattern.compile(
- "(?:\\+|-)?\\p{Digit}{1,17}(?:\\.\\p{Digit}{1,17})?(?:(?:E|e)(?:\\+|-)?\\p{Digit}{1,3})?");
+ "(?:\\+|-)?\\p{Digit}{1,}(?:\\.\\p{Digit}{1,})?(?:(?:E|e)(?:\\+|-)?\\p{Digit}{1,3})?");
+
private static final EdmDouble INSTANCE = new EdmDouble();
{code}
)
> Numbers having more than 17 digits in mantissa can't be parsed
> --------------------------------------------------------------
>
> Key: OLINGO-788
> URL: https://issues.apache.org/jira/browse/OLINGO-788
> Project: Olingo
> Issue Type: Bug
> Components: odata4-commons
> Affects Versions: (Java) V4 4.0.0-beta-03, (Java) V4 4.0.0
> Environment: any OS
> Reporter: Alexandre Boudnik
> Assignee: Alexandre Boudnik
> Priority: Critical
> Labels: easyfix
> Fix For: (Java) V4 4.1.0
>
> Attachments: OLINGO-788.patch
>
> Original Estimate: 1h
> Remaining Estimate: 1h
>
> regexp in {{lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDouble.java}} is too strict and thus it prevents parsing numbers having move than 17 digits before or after decimal point even they are just denormalized and have less then 17 meaningful digits, like 0.000001234567890123456 or 1234567890123456000000.0
> As I understand, regex in {{EdmDouble}} is used to prevent exception when the literal get parsed by {{new BigDecimal(String)}}. In not normalized literal zeroes may surround the significant digits. The maximum number of those can’t exceed 17, and decimal point symbol could be either within the sequence of them or not. It makes impossible to perform format check using one regex.
> Also http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/abnf/odata-abnf-construction-rules.txt contains the following definitions:
> {code}
> decimalValue = [SIGN] 1*DIGIT ["." 1*DIGIT]
> doubleValue = decimalValue [ "e" [SIGN] 1*DIGIT ] / nanInfinity ; IEEE 754 binary64 floating-point number (15-17 decimal digits)
> singleValue = doubleValue ; IEEE 754 binary32 floating-point number (6-9 decimal digits)
> nanInfinity = 'NaN' / '-INF' / 'INF'
> {code}
> If number of significant digits in literal will exceed the capacity of {{double}} or {{float}} it would be checked by comparing BigDecimal.doubleValue
> For formal point of view we do not have need to restrict literals by normalized decimal values, and thus regex for {{EdmDouble}} and {{EdmSingle}} should be relaxed.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)