Author Topic: Request for changing postvar (and urlvar) behaviour  (Read 5063 times)

0 Members and 1 Guest are viewing this topic.

Offline bacter

  • Operator
  • Tireless poster
  • *****
  • Posts: 682
    • View Profile
Re: Request for changing postvar (and urlvar) behaviour
« Reply #15 on: November 20, 2009, 11:39:43 PM »
Hi rejetto:
With new build 249 i get the following results of the above macros.

first run with windows booting:
Quote
3,5
8.7- 6.4 point: coma:
add 8.7 6.444 point:0 coma:15,144
sub 8.7 6.444 point:0 coma:2,256
mul 8.7 6.444 point:0 coma:56,0628
round 8.7345, 2 point: coma: 8,73
after re-run:
Quote
3.5
8.7- 6.4 point:2.3 coma:
add 8.7 6.444 point:15.144 coma:0
sub 8.7 6.444 point:2.256 coma:0
mul 8.7 6.444 point:56.0628 coma:0
round 8.7345, 2 point: 8.73 coma:
To avoid problems if somebody uses some floating point constants in the template, i suggest to use fixed point notation.
your computer has no brain - use your own !

Offline rejetto

  • Administrator
  • Tireless poster
  • *
  • Posts: 12953
    • View Profile
Re: Request for changing postvar (and urlvar) behaviour
« Reply #16 on: November 21, 2009, 12:23:50 AM »
thank you for your precious testing bacter.
i will think of a solution.

Offline Mars

  • Operator
  • Tireless poster
  • *****
  • Posts: 1895
    • View Profile
Re: Request for changing postvar (and urlvar) behaviour
« Reply #17 on: November 23, 2009, 12:01:08 AM »
By looking at the calls of functions system, it is evident that it is the local format of the server that is used for all the calculations

Code: [Select]
     result:=floatToStr(parF(0) [color=brown]operator[/color] parF(1));
Code: [Select]
function FloatToStr(Value: Extended): string;
Quote
function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;

Quote
result:=floatToStr(parF(0) operator parF(1)), FormatSetting(par('format'));

adding a param as 'format' can solve the bacter' problem , we can take Microsoft Excel as example to define the format  by using chars as '#' '0' ',' '.'   

## ##0,00   
0.#

etc ....

Code: [Select]
  TFormatSettings = record
    CurrencyFormat: Byte;
    NegCurrFormat: Byte;
    ThousandSeparator: Char;
    DecimalSeparator: Char;
    CurrencyDecimals: Byte;
    DateSeparator: Char;
    TimeSeparator: Char;
    ListSeparator: Char;
    CurrencyString: string;
    ShortDateFormat: string;
    LongDateFormat: string;
    TimeAMString: string;
    TimePMString: string;
    ShortTimeFormat: string;
    LongTimeFormat: string;
    ShortMonthNames: array[1..12] of string;
    LongMonthNames: array[1..12] of string;
    ShortDayNames: array[1..7] of string;
    LongDayNames: array[1..7] of string;
    TwoDigitYearCenturyWindow: Word;
  end;


{ Currency and date/time formatting options

  The initial values of these variables are fetched from the system registry
  using the GetLocaleInfo function in the Win32 API. The description of each
  variable specifies the LOCALE_XXXX constant used to fetch the initial
  value.

  CurrencyString - Defines the currency symbol used in floating-point to
  decimal conversions. The initial value is fetched from LOCALE_SCURRENCY.

  CurrencyFormat - Defines the currency symbol placement and separation
  used in floating-point to decimal conversions. Possible values are:

    0 = '$1'
    1 = '1$'
    2 = '$ 1'
    3 = '1 $'

  The initial value is fetched from LOCALE_ICURRENCY.

  NegCurrFormat - Defines the currency format for used in floating-point to
  decimal conversions of negative numbers. Possible values are:

    0 = '($1)'      4 = '(1$)'      8 = '-1 $'      12 = '$ -1'
    1 = '-$1'       5 = '-1$'       9 = '-$ 1'      13 = '1- $'
    2 = '$-1'       6 = '1-$'      10 = '1 $-'      14 = '($ 1)'
    3 = '$1-'       7 = '1$-'      11 = '$ 1-'      15 = '(1 $)'

  The initial value is fetched from LOCALE_INEGCURR.

  ThousandSeparator - The character used to separate thousands in numbers
  with more than three digits to the left of the decimal separator. The
  initial value is fetched from LOCALE_STHOUSAND.  A value of #0 indicates
  no thousand separator character should be output even if the format string
  specifies thousand separators.

  DecimalSeparator - The character used to separate the integer part from
  the fractional part of a number. The initial value is fetched from
  LOCALE_SDECIMAL.  DecimalSeparator must be a non-zero value.

  CurrencyDecimals - The number of digits to the right of the decimal point
  in a currency amount. The initial value is fetched from LOCALE_ICURRDIGITS.

  DateSeparator - The character used to separate the year, month, and day
  parts of a date value. The initial value is fetched from LOCATE_SDATE.

  ShortDateFormat - The format string used to convert a date value to a
  short string suitable for editing. For a complete description of date and
  time format strings, refer to the documentation for the FormatDate
  function. The short date format should only use the date separator
  character and the  m, mm, d, dd, yy, and yyyy format specifiers. The
  initial value is fetched from LOCALE_SSHORTDATE.

  LongDateFormat - The format string used to convert a date value to a long
  string suitable for display but not for editing. For a complete description
  of date and time format strings, refer to the documentation for the
  FormatDate function. The initial value is fetched from LOCALE_SLONGDATE.

  TimeSeparator - The character used to separate the hour, minute, and
  second parts of a time value. The initial value is fetched from
  LOCALE_STIME.

  TimeAMString - The suffix string used for time values between 00:00 and
  11:59 in 12-hour clock format. The initial value is fetched from
  LOCALE_S1159.

  TimePMString - The suffix string used for time values between 12:00 and
  23:59 in 12-hour clock format. The initial value is fetched from
  LOCALE_S2359.

  ShortTimeFormat - The format string used to convert a time value to a
  short string with only hours and minutes. The default value is computed
  from LOCALE_ITIME and LOCALE_ITLZERO.

  LongTimeFormat - The format string used to convert a time value to a long
  string with hours, minutes, and seconds. The default value is computed
  from LOCALE_ITIME and LOCALE_ITLZERO.

  ShortMonthNames - Array of strings containing short month names. The mmm
  format specifier in a format string passed to FormatDate causes a short
  month name to be substituted. The default values are fecthed from the
  LOCALE_SABBREVMONTHNAME system locale entries.

  LongMonthNames - Array of strings containing long month names. The mmmm
  format specifier in a format string passed to FormatDate causes a long
  month name to be substituted. The default values are fecthed from the
  LOCALE_SMONTHNAME system locale entries.

  ShortDayNames - Array of strings containing short day names. The ddd
  format specifier in a format string passed to FormatDate causes a short
  day name to be substituted. The default values are fecthed from the
  LOCALE_SABBREVDAYNAME system locale entries.

  LongDayNames - Array of strings containing long day names. The dddd
  format specifier in a format string passed to FormatDate causes a long
  day name to be substituted. The default values are fecthed from the
  LOCALE_SDAYNAME system locale entries.

  ListSeparator - The character used to separate items in a list.  The
  initial value is fetched from LOCALE_SLIST.

  TwoDigitYearCenturyWindow - Determines what century is added to two
  digit years when converting string dates to numeric dates.  This value
  is subtracted from the current year before extracting the century.
  This can be used to extend the lifetime of existing applications that
  are inextricably tied to 2 digit year data entry.  The best solution
  to Year 2000 (Y2k) issues is not to accept 2 digit years at all - require
  4 digit years in data entry to eliminate century ambiguities.

  Examples:

  Current TwoDigitCenturyWindow  Century  StrToDate() of:
  Year    Value                  Pivot    '01/01/03' '01/01/68' '01/01/50'
  -------------------------------------------------------------------------
  1998    0                      1900     1903       1968       1950
  2002    0                      2000     2003       2068       2050
  1998    50 (default)           1948     2003       1968       1950
  2002    50 (default)           1952     2003       1968       2050
  2020    50 (default)           1970     2003       2068       2050
 }



Offline bacter

  • Operator
  • Tireless poster
  • *****
  • Posts: 682
    • View Profile
Re: Request for changing postvar (and urlvar) behaviour
« Reply #18 on: November 23, 2009, 01:21:45 AM »
The problem is not the output (floatToStr). It might be ok that local settings of the server is used to format floating point values.
The problem is in the input, as macro does not use typed variables:
Suppose if you save in a #var the time: 40142,12345 with {.set|#t1|%now%.}
Then you want to calculate a time t2 32 hours or 1,5 days later.
In some systems you then should write: {.set|#t2|{.add|#t1|1,5.}.} and in another {.set|#t2|{.add|#t1|1.5.}.}

So it seems to me, the only solution is to make a full check if a varible is a number:

If first caracter is a digit, repeat for each of the following caracters if its a digit or a decimal separator ,(comma) OR .(point).
If a decimal separator is found, set decimal POINT and a flag and continue until a non digit value or end of string is found.

So:   1,234       -> 1.234
        1.234,547 -> 1.234
        1,23 GB    -> 1.23
Then calculations are done and the result can be output as now, using local settings.
your computer has no brain - use your own !

Offline rejetto

  • Administrator
  • Tireless poster
  • *
  • Posts: 12953
    • View Profile
Re: Request for changing postvar (and urlvar) behaviour
« Reply #19 on: November 23, 2009, 06:01:26 PM »
HFS sets comma as separator at start, ignoring local settings.
so, that's strange.
anway, i applied a workaround for next release.
let me know if it's enough.
« Last Edit: November 23, 2009, 06:03:23 PM by rejetto »