Текущее время: Ср, июл 23 2025, 13:13

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Количественное число 6 знаков до запятой, 6 знаков после прописью. РЕШЁН!
СообщениеДобавлено: Пн, июн 25 2012, 11:30 
Начинающий
Начинающий

Зарегистрирован:
Пн, июн 25 2012, 11:12
Сообщения: 1
Добрый день!
Появилась необходимость вывести прописью количество в граммах 6 знаков до запятой, 6 после. Должно работать наподобие ФМ SPELL_AMOUNT, только добавлять слова целых, стотысячных и т.д. Поделитесь кто сталкивался пожалуйста. :)
Заранее благодарен!

в общем сам соорудил (за отсутствие оптимизации прошу не пинать):

PROGRAM z_spell_quant.

DATA
: l_num_whole(13)
, l_num_integr(6)
, l_num_frac(6)
, l_frac_exist(1)
, l_str_integr TYPE string
, l_str_frac TYPE string
, l_str_both TYPE string
.

SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE text-010.
PARAMETERS: p_kol TYPE oiuh_dec15_6 OBLIGATORY DEFAULT '123456.123456'.
SELECTION-SCREEN END OF BLOCK 1.

PERFORM prepare USING p_kol CHANGING l_num_whole l_num_integr l_num_frac.

IF l_num_frac = '' OR l_num_frac = '0'.
l_frac_exist = ''.
ELSE.
l_frac_exist = 'X'.
ENDIF.

PERFORM integral_part USING l_num_integr l_frac_exist CHANGING l_str_integr.

PERFORM fractional_part USING l_num_frac l_frac_exist CHANGING l_str_frac.

CONCATENATE l_str_integr l_str_frac INTO l_str_frac SEPARATED BY space.

WRITE: / 'ИТОГО:', l_str_frac.


"определяем целые
*&---------------------------------------------------------------------*
*& Form prepare
*&---------------------------------------------------------------------*
FORM prepare USING p_kol TYPE oiuh_dec15_6
CHANGING p_whole
p_integer
p_frac.

p_whole = p_kol.
CONDENSE p_whole.
SPLIT p_whole AT '.' INTO: p_integer p_frac.
IF p_frac+1(5) = '00000'.
p_frac = p_frac(1).
ENDIF.
IF p_frac+2(4) = '0000'.
p_frac = p_frac(2).
ENDIF.
IF p_frac+3(3) = '000'.
p_frac = p_frac(3).
ENDIF.
IF p_frac+4(2) = '00'.
p_frac = p_frac(4).
ENDIF.
IF p_frac+5(1) = '0'.
p_frac = p_frac(5).
ENDIF.
ENDFORM. " FORM1
*&---------------------------------------------------------------------*
*& Form INTEGRAL_PART
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_L_STR_DC_1 text
* -->P_L_STR_DC_2 text
* <--P_L_STR_INTEGR text
*----------------------------------------------------------------------*
FORM integral_part USING p_integer
p_frac_exist
CHANGING p_str_integr.

DATA
: l_spell TYPE spell
, i TYPE i
, j TYPE i
.

CALL FUNCTION 'SPELL_AMOUNT'
EXPORTING
amount = p_integer
IMPORTING
in_words = l_spell.
p_str_integr = l_spell-word.

CHECK: p_frac_exist = 'X'.

i = STRLEN( p_str_integr ).
j = i - 3.
IF p_str_integr+j(3) = 'дин'.
CONCATENATE p_str_integr(j) 'дна целая' INTO p_str_integr.
ELSEIF p_str_integr+j(3) = 'два'.
CONCATENATE p_str_integr(j) 'две целых' INTO p_str_integr.
ELSEIF p_str_integr = 'Два'.
CONCATENATE p_str_integr(j) 'Две целых' INTO p_str_integr.
ELSE.
CONCATENATE p_str_integr 'целых' INTO p_str_integr SEPARATED BY space.
ENDIF.

ENDFORM. " INTEGRAL_PART
*&---------------------------------------------------------------------*
*& Form FRACTIONAL_PART
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_L_STR_DC_2 text
* -->P_L_FRAC_EXIST text
* <--P_L_STR_FRAC text
*----------------------------------------------------------------------*
FORM fractional_part USING p_num_frac
p_frac_exist
CHANGING p_str_frac.
DATA
: l_spell TYPE spell
, i TYPE i
, j TYPE i
, k TYPE i
, l_str_razryad_1(14)
, l_str_razryad_2(14)

.

CHECK: p_frac_exist = 'X'.


CALL FUNCTION 'SPELL_AMOUNT'
EXPORTING
amount = p_num_frac
IMPORTING
in_words = l_spell.
p_str_frac = l_spell-word.

TRANSLATE p_str_frac TO LOWER CASE.

i = STRLEN( p_str_frac ).
k = STRLEN( p_num_frac ).

CASE k.
WHEN '1'.
l_str_razryad_1 = 'десятых'.
l_str_razryad_2 = 'десятая'.
WHEN '2'.
l_str_razryad_1 = 'сотых'.
l_str_razryad_2 = 'сотая'.
WHEN '3'.
l_str_razryad_1 = 'тысячных'.
l_str_razryad_2 = 'тысячная'.
WHEN '4'.
l_str_razryad_1 = 'десятитысячных'.
l_str_razryad_2 = 'десятитысячная'.
WHEN '5'.
l_str_razryad_1 = 'стотысячных'.
l_str_razryad_2 = 'стотысячная'.
WHEN '6'.
l_str_razryad_1 = 'миллионных'.
l_str_razryad_2 = 'миллионная'.
ENDCASE.

j = i - 3.
IF p_str_frac+j(3) = 'дин'.
CONCATENATE p_str_frac(j) 'дна' INTO p_str_frac.
CONCATENATE p_str_frac l_str_razryad_2 INTO p_str_frac SEPARATED BY space.
ELSEIF p_str_frac+j(3) = 'два'.
CONCATENATE p_str_frac(j) 'две' INTO p_str_frac.
CONCATENATE p_str_frac l_str_razryad_1 INTO p_str_frac SEPARATED BY space.
ELSE.
CONCATENATE p_str_frac l_str_razryad_1 INTO p_str_frac SEPARATED BY space.
ENDIF.

ENDFORM. " FRACTIONAL_PART


Последний раз редактировалось Nick Korobkin Пн, июн 25 2012, 14:18, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Количественное число 6 знаков до запятой, 6 знаков после прописью
СообщениеДобавлено: Пн, июн 25 2012, 14:16 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
Видимо несколько раз придется SPELL_AMOUNT дернуть, отдельно для целой и дробной части


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Количественное число 6 знаков до запятой, 6 знаков после прописью. РЕШЁН!
СообщениеДобавлено: Пн, июн 25 2012, 14:29 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
А вот интересно (просто любопытно), дробная часть числа как предполагается к проговору? Или как правильно по "ГОСТу"? По самому правому ненулевому разряду в пределах заданной точности? Например, 0.015234 - это "пятнадцать тысяч двести тридцать четыре миллионных" или как-нибудь "пятнадцать тысячНЫХ двести тридцать четыре миллионных"? Или 0.01234 - "одна тысяча двести тридцать четыре стотысячных" ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB