Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / работа с DO CASE / 17 сообщений из 17, страница 1 из 1
20.03.2010, 00:56
    #36532142
работа с DO CASE
у меня есть вывод в отчёте числовое значения пропесью мне надо чтобы после этого числа шло слово рублей но не просто каждый раз рублей а с учётом окончания например (Двести пятьдесят рублей), (тридсать один рубль) или (сорок два рубля) как мне это зделать я зделал так:
DO CASE
CASE INLIST(r,'один')
STORE 'рубль' TO r
CASE INLIST(r,'два','три','четыри')
STORE 'рубля' TO r
CASE INLIST(r,'пять','шесть','семь','восемь','девять')
STORE 'рублей' TO r
ENDCASE
но оно почемуто у меня нечего не выводит ваще в отчёт помогите разрешить проблему
r-переменная глобальная обозначена в public
...
Рейтинг: 0 / 0
20.03.2010, 06:23
    #36532191
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
Почему бы не выводить просто "руб."
Формировать окончание нужно еще на этапе разбора самого числа, а не строки. Не видя функции, которую Вы используете, трудно сказать что-то более определенное.
...
Рейтинг: 0 / 0
20.03.2010, 06:39
    #36532192
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
Из справочника:
lcExt=""
Do Case
case tnflag=1
lcExt='ей' &&по умолчанию "рублей"
if lnTens<>1
Do case
case lnUnits=1 &&1, 21,31,...
lcExt='ь' &&"рубль"
case lnUnits>1.and.lnUnits<5
lcExt='я' &&"рубля"
Endcase
Endif
.........................
.........................
Endcase
Клепинин, Агафонова, VFP 9.0, 2007, стр. 412
...
Рейтинг: 0 / 0
20.03.2010, 09:30
    #36532229
igorbik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
лорд преисподнейCASE INLIST(r,'два','три','четыри')кому-то денег не будет совсем с такими "четырьмями" рублями
...
Рейтинг: 0 / 0
20.03.2010, 10:05
    #36532234
GermanGM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
лорд преисподней, допили лучше используемую функцию вывода суммы прописью, всего-то надо проанализировать 2 последних цифры, а не ловить эти пресловутые "четыри". А если "сорок", что тогда? (А суммы что - только целочисленные?)
...
Рейтинг: 0 / 0
20.03.2010, 10:32
    #36532241
igorbik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
лорд преисподней,

И вообще, если самому слабО, то поищи на фокс-сайтах функции по переводу сумм в прописи. Лучше на них посмотреть и разобраться,- много пользы будет.
...
Рейтинг: 0 / 0
20.03.2010, 10:52
    #36532251
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
лорд преисподнейу меня есть вывод в отчёте числовое значения пропесью мне надо чтобы после этого числа шло слово рублей но не просто каждый раз рублей а с учётом окончания например (Двести пятьдесят рублей), (тридсать один рубль) или (сорок два рубля) как мне это зделать я зделал так:
DO CASE
CASE INLIST(r,'один')
STORE 'рубль' TO r
CASE INLIST(r,'два','три','четыри')
STORE 'рубля' TO r
CASE INLIST(r,'пять','шесть','семь','восемь','девять')
STORE 'рублей' TO r
ENDCASE
но оно почемуто у меня нечего не выводит ваще в отчёт помогите разрешить проблему
r-переменная глобальная обозначена в public
У DO CASE есть еще секция OTHERWISE добавь в нее вывод значений и смотри чего у тебя не обработалось. Примерно так
Код: plaintext
1.
2.
3.
...
OTHERWISE
? r
ENDCASE
посмотри, увидишь много интересного. Твой CASE обрабатывает далеко не все возможные варианты.

PS Писать ответ в переменную с входным параметром не самый лучший подход в разработке.
...
Рейтинг: 0 / 0
20.03.2010, 12:09
    #36532328
работа с DO CASE
у меня работает перевод числа в строку и неплохо я использую DLL скаченую с сайта
...
Рейтинг: 0 / 0
20.03.2010, 13:02
    #36532361
GermanGM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
лорд преисподней, может тогда что-нибудь типа этого?

Код: plaintext
1.
return FunctionFromDLL(nSum)+[ рубл]+IIF(betw(nSum% 100 , 11 , 19 ) or inli(nSum% 10 , 0 , 5 , 6 , 7 , 8 , 9 ),[ей],IIF(nSum% 10 = 1 ,[ь],[я]))+IIF(nSum% 1 >=. 01 ,[ ]+padl(ltrim(str(int(nSum% 1 * 100 ))), 2 ,[ 0 ])+[ коп.],[])
...
Рейтинг: 0 / 0
21.03.2010, 22:20
    #36533575
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
лорд преисподнейпроп е сью
Интересное слово. Представляется пёс, несущийся иноходью пропесью в глубинах преисподней...

лорд преисподнейCASE INLIST(r,'два','три','четыр и ')
Нет такой буквы цифры!

Кстати, в _программе_ не хватает ещё одной цифры (искренне надеюсь, что перебираются цифры, а не числа :))
...
Рейтинг: 0 / 0
22.03.2010, 09:02
    #36533781
GermanGM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
XAndy, очевидно, пытается отодрать последнее слово в сумме прописью...
(кстати, каюсь: забыл в предложенном варианте INT(nSum)... Ну, ТС, если ему интересно, доработает
...
Рейтинг: 0 / 0
22.03.2010, 14:35
    #36534639
Wasilich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
Очень давно я делал так:
Выделял последнюю цифру из суммы (числового значения)
Например: CZ – числовое значение.
CZ=1234567
PC=VAL(RIGHT(ALLTRIM(STR(CZ)),1))
R=”руб.”
DO CASE
CASE PC = 1
R=”рубль”
CASE PC > 1 AND PC <5
R=”рубля”
CASE PC > 4
R=”рублей”
ENDCASE
Потом R дописывал к суме "ПРОПЕСЬЮ"
Кажись так.
...
Рейтинг: 0 / 0
22.03.2010, 15:09
    #36534765
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
WasilichОчень давно я делал так:
Выделял последнюю цифру из суммы (числового значения)
Например: CZ – числовое значение.
CZ=1234567
PC=VAL(RIGHT(ALLTRIM(STR(CZ)),1))
R=”руб.”
DO CASE
CASE PC = 1
R=”рубль”
CASE PC > 1 AND PC <5
R=”рубля”
CASE PC > 4
R=”рублей”
ENDCASE
Потом R дописывал к суме "ПРОПЕСЬЮ"
Кажись так.
Так у тебя "111 рубль" будет
выше уже писали что две цифры последние надо анализировать.
...
Рейтинг: 0 / 0
22.03.2010, 15:14
    #36534775
Wasilich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
Извиняюсь забыл об условии 10 - 20 рублей. Точно давно было.
CZ=1234567
PC1=VAL(RIGHT(ALLTRIM(STR(CZ)),1))
PC2=VAL(RIGHT(ALLTRIM(STR(CZ)),2))
R=”руб.”
IF PC2>10 AND PC2 < 20
R=”рублей”
ELSE
DO CASE
CASE PC1 = 1
R=”рубль”
CASE PC1 > 1 AND PC1 <5
R=”рубля”
CASE PC1 > 4
R=”рублей”
ENDCASE
ENDIF
...
Рейтинг: 0 / 0
23.03.2010, 12:36
    #36536621
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
Wasilich,
Ещё 0 рублей не учтен, ещё 0.12 рублей может потребоваться (бывает требуется без разложения на рубли/копейки), ещё не только рубли бывают, но и другие валюты, которые бывают и женского, и среднего рода, да и не только деньги :)

В простейшем случае может выручить такая функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
?  122 , numtxt( 122 , "рубл", "ь", "я", "ей")         &&  122  рубля
?  125 , numtxt( 125 , "процент", "", "а", "ов")       &&  125  процентов
?  1 , numtxt( 1 , "печат", "ь", "и", "ее")            &&  1  печать

*--------------------------
* iNum - число
* cBase - часть слова без окончания
* c1, с2, c5 окончания для одного, двух и пяти перечисляемых 
Function numtxt
lparameters iNum, cBase, c1, c2, c5
local cDigit, cWord
cDigit = right(str(iNum, 17 ), 1 )

do case
case between(iNum, 5 , 20 ) or iNum= 0  or mod(iNum, 1 )> 0  or between(cDigit,'5','9') or cDigit=='0'
   cWord = cBase + c5
case cDigit='1'
   cWord = cBase + c1
case between(cDigit,'2','4')
   cWord = cBase + c2
otherwise
   cWord = cBase + c1
endcase

return cWord

А в общем случае всё несколько сложнее. Для валют заводят свои справочники с прописанными правилами. Ещё есть более умные алгоритмы, которые сами знают правила русского языка...
...
Рейтинг: 0 / 0
23.03.2010, 15:01
    #36537227
Wasilich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с DO CASE
Все правильно уважаемый XAndy. Конкретной задаче нужно конкретное решение.
Я показал примерное направление решения проблеммы. А самих направлений - наверное столько, сколько программистов. В любом случае нужны знания, опыт и умение логически мыслить.
...
Рейтинг: 0 / 0
23.03.2010, 21:55
    #36538236
работа с DO CASE
Wasilich спасибо всё заработало ты мне очень помог
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / работа с DO CASE / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]