I would always suggest avoiding modeling numbers as strings.
I think it's always worthwhile to try to separate two concepts: The numeric value in the infoset, and it's representation before parsing/after-unparsing. Trailing zeros are a representation concept. The infoset doesn't have the concept of trailing zeros (nor leading zeros). The infoset value is a pure numeric value. Things that don't change the value, like leading or trailing zeros, or whether the data had comma separators in it when parsed, none of those affect the value, so they're not part of the infoset. If the value is 26.9230923 then it has 7 fraction digits. If it's 26.9 then it has one fraction digit. But there's no notion of how many it is "supposed to have". In reality, the value is stored in computer memory as a java Number - typically a Double, or a BigDecimal. Using dfdl:textNumberPattern you can parse/unparse any value so that its representation has the number of decimal places you want. If you want to make sure there are always one integer and two fractional digits, then textNumberPattern '###0.00' is what you want I think. -mike beckerle ________________________________ From: Costello, Roger L. <[email protected]> Sent: Monday, December 3, 2018 9:41:06 AM To: [email protected] Subject: RE: How to retain the digits to the right of the decimal point? Hi Steve, > In the case of decimal numbers, Daffodil creates > an infoset output with the minimum number of > digits necessary to display it with the same precision. > So 5000.00 will be output as 5000 If I want to retain the digits to the right of the decimal point, then I should declare the price element with the type xs:string, is that correct? /Roger -----Original Message----- From: Steve Lawrence <[email protected]> Sent: Monday, December 3, 2018 9:36 AM To: [email protected]; Costello, Roger L. <[email protected]> Subject: Re: How to retain the digits to the right of the decimal point? The pattern defines the format of the data. It does not define the format of the infoset. I believe the spec is ambiguous or silent about how various data fields should be output to the infoset. I know we've had this issue with date/time fields recently. In the case of decimal numbers, Daffodil creates an infoset output with the minimum number of digits necessary to display it with the same precision. So 5000.00 will be output as 5000, but 5000.99 will be output with the extra decimal precision. - Steve On 12/3/18 9:30 AM, Costello, Roger L. wrote: > Hi Mike, > > * Use 0 instead of # for the rightmost two. > > I tried that: > > <xs:elementname="price"type="xs:decimal" > dfdl:textStandardDecimalSeparator="." > dfdl:textNumberPattern="####.00"/> > > It gave the same result (the .00 is removed): > > 5000.00 --> parse --> 5000 > > Thoughts? > > /Roger > > *From:* Mike Beckerle <[email protected]> > *Sent:* Monday, December 3, 2018 9:21 AM > *To:* [email protected] > *Subject:* Re: How to retain the digits to the right of the decimal point? > > Use 0 instead of # for the rightmost two. In a pattern, a zero denotes > any digit. A # denotes an optional digit. > > -------- Original message -------- > > From: "Costello, Roger L." <[email protected] > <mailto:[email protected]>> > > Date: 12/3/18 8:46 AM (GMT-05:00) > > To: [email protected] <mailto:[email protected]> > > Subject: How to retain the digits to the right of the decimal point? > > Hello DFDL community, > > My input contains decimal values such as: 2999.99 and 5000.00 > > When I parse my input, the .00 gets removed, e.g., > > 5000.00 --> parse --> 5000 > > But the .99 is not removed, e.g., > > 2999.99 --> parse --> 2999.99 > > I want to retain the two digits to the right of the decimal point, > even if they are 00 > > How to retain the digits? I thought this would do the job: > > dfdl:textNumberPattern="####.##"/> > > However, that has no effect. > > What's the right way to do it? > > /Roger >
