Страница 1 из 1

REAL -> CURRENCY

Добавлено: 26 Май 2010, 16:32
Admin
Есть C++ тип данных CURRENCY
Нужно в него засунуть DECIMAL или REAL
Как сделать?
И что такое CURRENCY, типа

Код: Выделить всё

CURRENCY  GROUP 
Low         LONG
Hi          LONG
          END
??
Спасибо.

Re: REAL -> CURRENCY

Добавлено: 26 Май 2010, 17:19
Andrew Listiev
Имхо, это large long

Re: REAL -> CURRENCY

Добавлено: 26 Май 2010, 19:18
Дед Пахом
Не знаю, к C++ подойдёт ли? поищи 'typedef' для CURRENCY.

Код: Выделить всё

!MSDN:
!The COM CY and Visual Basic Currency type is a signed 64-bit integer in units of 1/10,000 (or 1/100 of a cent).
!The currency type can accurately represent dollars and cents values, so it's good for financial calculations.
!The range of the currency type is more than +/- 900 trillion, so it'll even cover calculations of the national debt, at least for the foreseeable future.
!CURRENCY              EQUATE(REAL)
!CY                    EQUATE(CURRENCY)
или так:

Код: Выделить всё

!CY                    GROUP,TYPE
!Lo                      ULONG
!Hi                      LONG
!                      END
!CURRENCY              EQUATE(CY)

Re: REAL -> CURRENCY

Добавлено: 27 Май 2010, 6:13
Admin
Подходит в принципе даже LONG LONG но вопрос сейчас встал - как засунуть в эти два лонга число REAL
Т.е. как с BSHIFT и т.д. разобраться с учетом что эти операции работают только с числом типа LONG
LONGLow = BAND(REAL,0FFFFFFFFh)
LONGHigh = BSHIFT(REAL,-32)

Я в ступоре...

Re: REAL -> CURRENCY

Добавлено: 27 Май 2010, 11:56
Дед Пахом
Вот нашёл у себя такой кусок:

Код: Выделить всё

  cyVal.Lo=INT(pValue)*10000 + (pValue-INT(pValue))*10000
правда, есть ремарка: i know how to process only small positive currency values

Re: REAL -> CURRENCY

Добавлено: 31 Май 2010, 7:41
Admin
По итогу, сделали вот таким образом. Может тупо но работает.

Код: Выделить всё

Currency          GROUP,TYPE
Low                 ULONG
High                ULONG
                  END

Real2Currency     PROCEDURE(REAL Price, *Currency Result)
Cnt               LONG
  CODE
  CLEAR(Result.Low)
  CLEAR(Result.High)
  LOOP Cnt = 64 TO 0 BY -1
    IF Price >= 2^Cnt
      IF Cnt >= 32
        Result.High += 2^(Cnt-32)
      ELSE
        Result.Low += 2^Cnt
      END
      Price -= 2^Cnt
    END
  END
Еще по ходу работы нарвались на такой финт Кларионовских неявных преобразований типов.
Выполнить и задуматься...

Код: Выделить всё

MESSAGE(1000000*10000)
А код

Код: Выделить всё

MESSAGE(1000000*10^4)
прекрасно работает.

Можно влететь. Хотя вроде раньше как то проносило.

Re: REAL -> CURRENCY

Добавлено: 31 Май 2010, 9:09
Дед Пахом
Для отрицательных значений работать не будет (дефицит бюджета получить не удасться).

Re: REAL -> CURRENCY

Добавлено: 31 Май 2010, 9:37
Admin
В нашем случае только положительные нужны. Так что делалось под конкретую задачу.
Переделать думаю не трудно. Мне пока не нужно.
Спасибо