axis-c-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "John Bodfish" <jbodf...@fdusa.com>
Subject RE: float type and date time format
Date Thu, 09 Dec 2004 17:14:11 GMT
Jean:

I don't think I can be of any further assistance since I don't have a
current copy of Axis C++.

IMHO monetary amounts should *NEVER* be encoded into strings as a floating
point number. They should be "normalized" (all modern currencies have 2 or
(very rarely) 3 decimal digits) so that $10.05 becomes "1005" and there's an
implied decimal point. Belt-and-suspenders types can add an attribute that
explicitly states the number of decimal positions. This would eliminate the
problem you're having. Also currencies need currency codes - or else there's
too great a chance of being misunderstood (for example, was the "$" in my
example US dollars or Canadian dollars?).

Of course as you say you can't modify the third party wsdl. Let's hope
nobody uses systems built with it! ;)

John

-----Original Message-----
From: Jean ANDRE [mailto:jandre@cmtek.com] 
Sent: Thursday, December 09, 2004 10:41 AM
To: Apache AXIS C User List
Subject: Re: float type and date time format

Bonjour John,

Thank you very much for your answer.
In my case, as we talk about money and paiement system, it is 
"unacceptable" to pay 98.989998 when the price is 98.99 !. 
Well, well, as I sent the correct type according to the WSDL  and Axis 
generation classes and as I have no way to modify the third party wsdl 
file, that means it is a serious problem from Axis, whitout no quick 
solution ? hum, hum...  :(

So, to return back to the time date, do you think that is not a problem 
for the webservice to understand such datetime? because I've still have 
a problem of the XML parser. It is not  the name space ns1 instead of 
nothing (see related answer, it should be ok)- . It is not the float 
number ?, it is not the date-time format ?  and I still have a bat ptr 
in Axis.... to get my value after a complex type on the answer from the 
web services!

Take care and thank again for your answer!

Jean A - Canada




John Bodfish wrote:

>Bonjour aussi!
>
>I don't know the answer to most of your questions, but here are some
>comments.
>
>You wrote:
>	With float number, 77.99 becomes 77.989998 output string under Axis.
>
>I think that's probably because conversion of a string "77.99" to the
>representation of a floating point number and back again is likely to lead
>to "small" differences. Whether you think 0.000002 is a "small" difference
>probably depends on whether you're calculating the size of the moon or your
>trajectory to it. :) There's probably a way to restrict the number of
>decimal digits in the string representation of the floating point number,
in
>which case "77.989998" internal representation would get rounded up to
>"77.99" when converted to a string.
>
> 
>You also wrote:
>	I supposed that Z is for TimeZone?
>
>That's a good guess. 'Z' is for "UTC", or Coordinated Universal Time. See
>http://en.wikipedia.org/wiki/Coordinated_Universal_Time for more on UTC.
>
>The World Wide Web Consortium has a note about date and time formats
>(http://www.w3.org/TR/NOTE-datetime) where it states:
>
>"This profile defines two ways of handling time zone offsets:
>
>1. Times are expressed in UTC (Coordinated Universal Time), with a special
>UTC designator ("Z"). 
>2. Times are expressed in local time, together with a time zone offset in
>hours and minutes. A time zone offset of "+hh:mm" indicates that the
>date/time uses a local time zone which is "hh" hours and "mm" minutes ahead
>of UTC. A time zone offset of "-hh:mm" indicates that the date/time uses a
>local time zone which is "hh" hours and "mm" minutes behind UTC. 
>
>A standard referencing this profile should permit one or both of these ways
>of handling time zone offsets."
>
>I don't know what the relevant SOAP standards state, but the date strings
>you get look like they both conform.
>
>The string "2004-12-08T00:00:00.0000000-05:00" that .NET/Java produces
>represents midnight, the morning of December 8th, 2004 in a time zone that
>is 5 hours behind UTC (such as the Eastern Time zone of Canada).
>
>The string "2004-12-09T19:54:32Z" that Axis produces represents December
>9th, 2004 at 19:54:32 UTC, which would be 14:54:32 in the Eastern Time Zone
>of Canada.
>
>I don't know where the asterisks in the Axis date string come from.
>
>I hope others help with the rest of your questions!
>
>John
>
>
>
>-----Original Message-----
>From: Jean ANDRE [mailto:jandre@cmtek.com] 
>Sent: Thursday, December 09, 2004 9:31 AM
>To: axis-c-user@ws.apache.org
>Subject: float type and date time format
>
>Bonjour everybody!
>
>Well, I have a strange behavior with floating number and date time format.
>
> 1 ) With float number, 77.99 becomes 77.989998 output string under 
>Axis. Why I lost some digits ??????!!!
>
> 2) With datetime format , in c++ test code, I just  moved some fields 
>to another one of the same structure and I get the following output 
>string: with Axis
>    <txnDate>*2004-12-09T19:54:32Z*</txnDate>
>  
> I supposed that Z is for TimeZone ?  But how to construct a time to 
>obtain such string ?
>
>With dot-net client application and a java application I got the 
>following string:
><txnDate>2004-12-08T00:00:00.0000000-05:00</txnDate>
>
>Thanks a lot for your answers. Take care!
>
>Jean .A - Canada
>
>
>In c++ test code, I put the following code according to the WSDL.
>
>C++ Test code under Microsoft  Visual C++
>==============================
>class TxnAmount
>{
>public:
>    float amount;
>    xsd__string currency;
>    TxnAmount();
>    ~TxnAmount();
>};
>
>    xsd__dateTime txnDate;
>    tm* curTime;
>    time_t timer;
>
>
>    amount.amount = 77.99;                // paymentForm.amount
>    amount.currency = "USD";            // paymentForm.currency
>
>
>    memset(&txnDate, 0x00, sizeof(xsd__dateTime));
>    timer = time(NULL);
>    curTime = localtime( &timer );
>    txnDate.tm_isdst    = curTime->tm_isdst;
>    txnDate.tm_hour        = curTime->tm_hour;
>    txnDate.tm_min        = curTime->tm_min;
>    txnDate.tm_sec        = curTime->tm_sec;
>    txnDate.tm_wday        = curTime->tm_wday;
>    txnDate.tm_yday        = curTime->tm_yday;
>    txnDate.tm_mday        = curTime->tm_mday;             // 
>paymentForm.txnDateD - day of the month - [1,31]
>    txnDate.tm_mon        = curTime->tm_mon;                // 
>paymentForm.txnDateM - months since January - [0,11]
>    txnDate.tm_year        = curTime->tm_year;                // 
>paymentForm.txnDateY - years since 1900
>
>Fragment of the WDSL:
>==================
>      <xs:element name="txnDate" type="xs:dateTime" minOccurs="0">
>      </xs:element>
>      <xs:complexType name="TxnAmount">
>        <xs:sequence>
>          <xs:element name="amount">
>            <xs:simpleType>
>              <xs:restriction base="xs:float">
>                <xs:minInclusive value="0.00"/>
>                <xs:maxInclusive value="9999999999.99"/>
>              </xs:restriction>
>            </xs:simpleType>
>          </xs:element>
>          <xs:element name="currency" minOccurs="0">
>            <xs:simpleType>
>              <xs:restriction base="xs:string">
>                <xs:enumeration value="USD"/>
>                <xs:enumeration value="CAD"/>
>              </xs:restriction>
>            </xs:simpleType>
>          </xs:element>
>        </xs:sequence>
>      </xs:complexType>
>
>
>Fragment of the string sent by AXIS ??  Look the field amount !!!!
>=============================================
><ns1:txnRequest>
><orderTotal>
><amount>77.989998</amount>
><currency>USD</currency>
></orderTotal>
><billTo>
>
><txnDate>*2004-12-09T19:54:32Z*</txnDate>
>
>
>
>
>  
>




Mime
View raw message