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
>

Reply via email to