FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9210
Вход
Денежная сумма прописью

Выдает прописью сумму (руб/коп) до 999 999 999 999.99. Сразу оговорюсь, алгоритм не мой, но более короткого я не встречал. Авось кому пригодится.


 
Прислал: alexd   Категория: Разное


  
  nSumm = 999999999999.99  
 *!*	@ 1,1 get nSumm  
 *!*	READ  
  CLEAR  
  @ 2,1 say(Speeling(nSumm))  
    
  FUNCTION Speeling  
  PARAMETER nSumma  
  PRIVATE cSumma  
   * k - копейки  
    cSumma = TRANSFORM(M.nSumma,'9,9,,9,,,,,,9,9,,9,,,,,9,9,,9,,,,9,9,,9,,,.99')+'k'  
   * t - тысячи; m - миллионы; M - миллиарды  
    cSumma = STRTRAN(M.cSumma, ',,,,,,', 'eM')  
    cSumma = STRTRAN(M.cSumma, ',,,,,',  'em')  
    cSumma = STRTRAN(M.cSumma, ',,,,',   'et')  
    
   * e - единицы; d - десятки; c - сотни  
    cSumma = STRTRAN(M.cSumma, ',,,', 'e')  
    cSumma = STRTRAN(M.cSumma, ',,',  'd')  
    cSumma = STRTRAN(M.cSumma, ',',   'c')  
    
    cSumma = STRTRAN(M.cSumma, '0c0d0et', '')  
    cSumma = STRTRAN(M.cSumma, '0c0d0em', '')  
    cSumma = STRTRAN(M.cSumma, '0c0d0eM', '')  
    
    cSumma = STRTRAN(M.cSumma, '0c', '')  
    cSumma = STRTRAN(M.cSumma, '1c', 'сто ')  
    cSumma = STRTRAN(M.cSumma, '2c', 'двести ')  
    cSumma = STRTRAN(M.cSumma, '3c', 'триста ')  
    cSumma = STRTRAN(M.cSumma, '4c', 'четыреста ')  
    cSumma = STRTRAN(M.cSumma, '5c', 'пятьсот ')  
    cSumma = STRTRAN(M.cSumma, '6c', 'шестьсот ')  
    cSumma = STRTRAN(M.cSumma, '7c', 'семьсот ')  
    cSumma = STRTRAN(M.cSumma, '8c', 'восемьсот ')  
    cSumma = STRTRAN(M.cSumma, '9c', 'девятьсот ')  
    
    cSumma = STRTRAN(M.cSumma, '1d0e', 'десять ')  
    cSumma = STRTRAN(M.cSumma, '1d1e', 'одиннадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d2e', 'двенадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d3e', 'тринадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d4e', 'четырнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d5e', 'пятнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d6e', 'шестнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d7e', 'семьнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d8e', 'восемнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d9e', 'девятнадцать ')  
    
    cSumma = STRTRAN(M.cSumma, '0d', '')  
    cSumma = STRTRAN(M.cSumma, '2d', 'двадцать ')  
    cSumma = STRTRAN(M.cSumma, '3d', 'тридцать ')  
    cSumma = STRTRAN(M.cSumma, '4d', 'сорок ')  
    cSumma = STRTRAN(M.cSumma, '5d', 'пятьдесят ')  
    cSumma = STRTRAN(M.cSumma, '6d', 'шестьдесят ')  
    cSumma = STRTRAN(M.cSumma, '7d', 'семьдесят ')  
    cSumma = STRTRAN(M.cSumma, '8d', 'восемьдесят ')  
    cSumma = STRTRAN(M.cSumma, '9d', 'девяносто ')  
    
    cSumma = STRTRAN(M.cSumma, '0e', '')  
    cSumma = STRTRAN(M.cSumma, '5e', 'пять ')  
    cSumma = STRTRAN(M.cSumma, '6e', 'шесть ')  
    cSumma = STRTRAN(M.cSumma, '7e', 'семь ')  
    cSumma = STRTRAN(M.cSumma, '8e', 'восемь ')  
    cSumma = STRTRAN(M.cSumma, '9e', 'девять ')  
    
    cSumma = STRTRAN(M.cSumma, '1e.', 'один рубль ')  
    cSumma = STRTRAN(M.cSumma, '2e.', 'два рубля ')  
    cSumma = STRTRAN(M.cSumma, '3e.', 'три рубля ')  
    cSumma = STRTRAN(M.cSumma, '4e.', 'четыре рубля ')  
    cSumma = STRTRAN(M.cSumma, '1et', 'одна тысяча ')  
    cSumma = STRTRAN(M.cSumma, '2et', 'две тысячи ')  
    cSumma = STRTRAN(M.cSumma, '3et', 'три тысячи ')  
    cSumma = STRTRAN(M.cSumma, '4et', 'четыре тысячи ')  
    cSumma = STRTRAN(M.cSumma, '1em', 'один миллион ')  
    cSumma = STRTRAN(M.cSumma, '2em', 'два миллиона ')  
    cSumma = STRTRAN(M.cSumma, '3em', 'три миллиона ')  
    cSumma = STRTRAN(M.cSumma, '4em', 'четыре миллиона ')  
    cSumma = STRTRAN(M.cSumma, '1eM', 'один миллиард ')  
    cSumma = STRTRAN(M.cSumma, '2eM', 'два миллиарда ')  
    cSumma = STRTRAN(M.cSumma, '3eM', 'три миллиарда ')  
    cSumma = STRTRAN(M.cSumma, '4eM', 'четыре миллиарда ')  
    
    cSumma = STRTRAN(M.cSumma, '11k', '11 копеек')  
    cSumma = STRTRAN(M.cSumma, '12k', '12 копеек')  
    cSumma = STRTRAN(M.cSumma, '13k', '13 копеек')  
    cSumma = STRTRAN(M.cSumma, '14k', '14 копеек')  
    cSumma = STRTRAN(M.cSumma, '1k', '1 копейка')  
    cSumma = STRTRAN(M.cSumma, '2k', '2 копейки')  
    cSumma = STRTRAN(M.cSumma, '3k', '3 копейки')  
    cSumma = STRTRAN(M.cSumma, '4k', '4 копейки')  
    
    cSumma = STRTRAN(M.cSumma, '.', 'рублей ')  
    cSumma = STRTRAN(M.cSumma, 't', 'тысяч ')  
    cSumma = STRTRAN(M.cSumma, 'm', 'миллионов ')  
    cSumma = STRTRAN(M.cSumma, 'M', 'миллиардов ')  
    cSumma = STRTRAN(M.cSumma, 'k', ' копеек')  
    m.cSumma=allt(IIF(M.nSumma < 10**12, M.cSumma, ALLTRIM(STR(M.nSumma,20,2))))  
    m.cSumma=upper(left(m.cSumma,1))+lower(substr(m.cSumma,2))  
    
  RETURN m.cSumma  
  

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (2)
Дополнения пользователей
Денежная сумма прописью
[+][?]
d_S_b
12.01.08 15:21:50

Красиво!
Для еще большей красоты можно вставить после 
PARAMETER nSumma  

If Empty(nSumma) && Если не задан параметр
    nSumma = 0
EndIf

и вставить строку

cSumma = Iif(M.nSumma < 1,'нуль '+allt(M.cSumma),M.cSumma)

после строки

cSumma = STRTRAN(M.cSumma, 'k', ' копеек')

для отображения сумм типа 0.25
OLEGarh
14.01.08 09:36:12

Привет всем!

Чтой-то не фурычит - из самого же примера получаю:

nSumm = 999999999999.99

m.cSumma = "9 9  9      9 9  9     9 9  9    9 9  9   c99 копеек"

Что не так? Да и TRANSFORM() мудренный...

Best regards!

Дядя Саша
14.01.08 16:23:42

В VFP v.9 результат аналогичный d_S_b
проверил в v.5 - все ОК .
Причина - TRANSFORM ?
OLEGarh
15.01.08 11:42:13

Да, я пробовал именно на 9-ке + SP1

В других версиях - нет, по причине полного ухода всех прог на 9-ку

Best regards!
OLEGarh
15.01.08 11:59:11

Да, я пробовал именно на 9-ке + SP1

В других версиях - нет, по причине полного ухода всех прог на 9-ку

Best regards!
Myhailo
15.01.08 18:33:10

Ждем красоту на VFP9 SP2.
Спасибо.
Рома
15.01.08 21:14:55

Правильно так
[code]
  FUNCTION Speling  
  PARAMETER nSumma  
  PRIVATE cSumma  
   * k - копейки  
	cSumma = Transform(M.nSumma,'@L 9c9d9eb9c9d9em9c9d9et9c9d9e.99')+' k'
    
	cSumma = Strtran(M.cSumma, '0c0d0et', '')
	cSumma = Strtran(M.cSumma, '0c0d0em', '')
	cSumma = Strtran(M.cSumma, '0c0d0eb', '')
    
    cSumma = STRTRAN(M.cSumma, '0c', '')  
    cSumma = STRTRAN(M.cSumma, '1c', 'сто ')  
    cSumma = STRTRAN(M.cSumma, '2c', 'двести ')  
    cSumma = STRTRAN(M.cSumma, '3c', 'триста ')  
    cSumma = STRTRAN(M.cSumma, '4c', 'четыреста ')  
    cSumma = STRTRAN(M.cSumma, '5c', 'пятьсот ')  
    cSumma = STRTRAN(M.cSumma, '6c', 'шестьсот ')  
    cSumma = STRTRAN(M.cSumma, '7c', 'семьсот ')  
    cSumma = STRTRAN(M.cSumma, '8c', 'восемьсот ')  
    cSumma = STRTRAN(M.cSumma, '9c', 'девятьсот ')  
    
    cSumma = STRTRAN(M.cSumma, '1d0e', 'десять ')  
    cSumma = STRTRAN(M.cSumma, '1d1e', 'одиннадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d2e', 'двенадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d3e', 'тринадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d4e', 'четырнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d5e', 'пятнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d6e', 'шестнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d7e', 'семьнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d8e', 'восемнадцать ')  
    cSumma = STRTRAN(M.cSumma, '1d9e', 'девятнадцать ')  
    
    cSumma = STRTRAN(M.cSumma, '0d', '')  
    cSumma = STRTRAN(M.cSumma, '2d', 'двадцать ')  
    cSumma = STRTRAN(M.cSumma, '3d', 'тридцать ')  
    cSumma = STRTRAN(M.cSumma, '4d', 'сорок ')  
    cSumma = STRTRAN(M.cSumma, '5d', 'пятьдесят ')  
    cSumma = STRTRAN(M.cSumma, '6d', 'шестьдесят ')  
    cSumma = STRTRAN(M.cSumma, '7d', 'семьдесят ')  
    cSumma = STRTRAN(M.cSumma, '8d', 'восемьдесят ')  
    cSumma = STRTRAN(M.cSumma, '9d', 'девяносто ')  
    
    cSumma = STRTRAN(M.cSumma, '0e', '')  
    cSumma = STRTRAN(M.cSumma, '5e', 'пять ')  
    cSumma = STRTRAN(M.cSumma, '6e', 'шесть ')  
    cSumma = STRTRAN(M.cSumma, '7e', 'семь ')  
    cSumma = STRTRAN(M.cSumma, '8e', 'восемь ')  
    cSumma = STRTRAN(M.cSumma, '9e', 'девять ')  
    
    cSumma = STRTRAN(M.cSumma, '1e.', 'один рубль ')  
    cSumma = STRTRAN(M.cSumma, '2e.', 'два рубля ')  
    cSumma = STRTRAN(M.cSumma, '3e.', 'три рубля ')  
    cSumma = STRTRAN(M.cSumma, '4e.', 'четыре рубля ')  
    cSumma = STRTRAN(M.cSumma, '1et', 'одна тысяча ')  
    cSumma = STRTRAN(M.cSumma, '2et', 'две тысячи ')  
    cSumma = STRTRAN(M.cSumma, '3et', 'три тысячи ')  
    cSumma = STRTRAN(M.cSumma, '4et', 'четыре тысячи ')  
    cSumma = STRTRAN(M.cSumma, '1em', 'один миллион ')  
    cSumma = STRTRAN(M.cSumma, '2em', 'два миллиона ')  
    cSumma = STRTRAN(M.cSumma, '3em', 'три миллиона ')  
    cSumma = STRTRAN(M.cSumma, '4em', 'четыре миллиона ')  
    cSumma = STRTRAN(M.cSumma, '1eb', 'один миллиард ')  
    cSumma = STRTRAN(M.cSumma, '2eb', 'два миллиарда ')  
    cSumma = STRTRAN(M.cSumma, '3eb', 'три миллиарда ')  
    cSumma = STRTRAN(M.cSumma, '4eb', 'четыре миллиарда ')  
    
    cSumma = STRTRAN(M.cSumma, '11k', '11 копеек')  
    cSumma = STRTRAN(M.cSumma, '12k', '12 копеек')  
    cSumma = STRTRAN(M.cSumma, '13k', '13 копеек')  
    cSumma = STRTRAN(M.cSumma, '14k', '14 копеек')  
    cSumma = STRTRAN(M.cSumma, '1k', '1 копейка')  
    cSumma = STRTRAN(M.cSumma, '2k', '2 копейки')  
    cSumma = STRTRAN(M.cSumma, '3k', '3 копейки')  
    cSumma = STRTRAN(M.cSumma, '4k', '4 копейки')  
    
    cSumma = STRTRAN(M.cSumma, '.', 'рублей ')  
    cSumma = STRTRAN(M.cSumma, ',', 'рублей ')  
    cSumma = STRTRAN(M.cSumma, 't', 'тысяч ')  
    cSumma = STRTRAN(M.cSumma, 'm', 'миллионов ')  
    cSumma = STRTRAN(M.cSumma, 'b', 'миллиардов ')  
    cSumma = STRTRAN(M.cSumma, 'k', ' копеек')  
    m.cSumma=allt(IIF(M.nSumma < 10**12, M.cSumma, ALLTRIM(STR(M.nSumma,20,2))))  
    m.cSumma=upper(left(m.cSumma,1))+lower(substr(m.cSumma,2))  
    
  RETURN m.cSumma
[/code]
OLEGarh
16.01.08 12:08:55

Вроде бы фурычит, тока:

1.убрать прбел в 
cSumma = Transform(M.nSumma,'@L 9c9d9eb9c9d9em9c9d9et9c9d9e.99')+' k', т.е. cSumma =
Transform(M.nSumma,'@L 9c9d9eb9c9d9em9c9d9et9c9d9e.99')+'k'

2.учитывать региональные настройки (точка-запятая в разделителе дробной части), т.е. мне пришлось
поменять в
 cSumma = STRTRAN(M.cSumma, '1e.', 'один рубль ') на
cSumma = STRTRAN(M.cSumma, '1e,', 'один рубль ')  

Best regards!



Рома
16.01.08 14:06:17

1. или здесь пробел убрать
  cSumma = STRTRAN(M.cSumma, 'k', ' копеек')

2.лучше в самом начале добавить
cSumma = STRTRAN(M.cSumma, ',', '.')
а дальше оставить как есть
тогда и строчку
cSumma = STRTRAN(M.cSumma, ',', 'рублей ')
можно удалить.

Рома
16.01.08 14:13:57

Автор, обнови решение раз уж опубликовал.

И в следующем решении для украинского языка те же недочеты.
OLEGarh
17.01.08 12:12:40

При вводе значений меньше 100 - тоже неправильно обрабатывается.


[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика