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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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