Текстовое представление числа

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Текстовое представление числа

Сообщение Marisha_P »

Подскажите, пожалуйста, как вывести прописью числа.
Вывод должен быть в формате: "Всего: одна тонна, десять штук"
стандартным doubletostr не получится? ведь могут быть и целые числа и дробные.. и род числа может быть разным - штука, комплект
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Re: Текстовое представление числа

Сообщение Maverick »

Ну почему же... DoubleToStr - функция достаточно универсальная. Главное, что правильно формат указать нужно:
Например

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

 55.555  '45'  пятьдесят пять пятьсот пятьдесят пять тысячных
 
 55.555 '4 5'  пятьдесят пять пятьсот пятьдесят пять тысячных
 
 55.555  '4 8899'  пятьдесят пять 555
 
 55.555  '6677 5'  55 пятьсот пятьдесят пять тысячных
 
 23.555  '6 6 4 66 5 8888'  2 3 двадцать три 23 пятьсот пятьдесят пять тысячных 5550
 
 55.555  '4 руб. 5 коп.'  пятьдесят пять руб. пятьсот пятьдесят пять тысячных коп.
 
 21.215  '\m4 руб. \f\2p5 коп.'  двадцать один руб. двадцать две сотых коп.
 
 21.215  '\m4 руб. \2p5 коп.'  двадцать один руб. двадцать два сотых коп.
Более подробно написано в хелпе, в статье "Формат преобразования вещественных чисел в строку"
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Текстовое представление числа

Сообщение Marisha_P »

это я тоже нашла.. а если 10,5855 тонн, то как расписать 10 т 585 кг 500 г ?:)
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Re: Текстовое представление числа

Сообщение Maverick »

Ну, по видимому, должен быть конгломерат вычислений.
На мой взгляд самый простой способ такой:
1. Сначала анализируем длину дробной части выражения,
2. потом - первую часть вычисляем стандартно через DoubleTo Str,
3. хвостик - самостоятельно.
Ф-я то расчитана только на преобразование целой и дробной части, без учета рекурсии вхождения одних едИзм в другие...

Если такой подход не устраивает, всегда можно самостоятельно нужную ф-ю наваять или заюзать ту, которую нашли в инете и она Вас устраивает.
В первом случае - реализуется на ВИПе.
В последнем - главное условие: чтобы найденная ф-я содержалась в какой нить - DLL, которую можно зарегистрировать в ВИП
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: Текстовое представление числа

Сообщение Zver »

Больше похоже на костыль, но может получится так:

10,5855 тонн в 10 тыс 585 руб 500 коп,

а затем в полученной строке заменяем денежные единицы на нужные строковыми функциями?
Программист-самоучка
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Текстовое представление числа

Сообщение Marisha_P »

а какая функция так разбирает по цифрам? в doubletostr всегда будет разрядность в наименовании
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: Текстовое представление числа

Сообщение Zver »

Из документации (особенно раздел "Текстовое представление дробной части:"):

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

Вывод знака числа:

DoubleToStr(55.55,'3666.88') = '+55.55'
DoubleToStr(-55.55,'3666.88') = '-55.55'
DoubleToStr(55.55,'[|-]3666.88') = '55.55'
DoubleToStr(-55.55,'[|-]3666.88') = '-55.55'
Текстовое представление целой части:

DoubleToStr(5.555,'4КГ 5') =
   'пять КГ пятьсот пятьдесят пять тысячных'
DoubleToStr(55.55,'4') = 'пятьдесят пять'
   // по умолчанию не округляет, берет только целую часть числа
DoubleToStr(55.55,'\0p4') = 'пятьдесят шесть'
   // чтобы округлило до целых, необходимо использовать \0p
DoubleToStr(Round(55.55),'4') = 'пятьдесят шесть'
   // или подавать на вход уже округленное число
Текстовое представление дробной части:

DoubleToStr( 0.00, '4 целых 5') = 'ноль целых ноль десятых'
DoubleToStr(5.555,'4КГ 5') =
   'пять КГ пятьсот пятьдесят пять тысячных'
DoubleToStr(5.555,'\2p4КГ 5') = 'пять КГ пятьдесят шесть сотых'
   // для округления до сотых - надо явно прописать \2p
DoubleToStr(5.555,'\1p4КГ 5') = 'пять КГ шесть десятых'
   // для округления до десятых - надо явно прописать \1p
Необязательная (незначимая) цифра целой части:

DoubleToStr(5,'666') ='5'
DoubleToStr(55,'666') ='55'
DoubleToStr(555,'666') = '555'
DoubleToStr(5555,'666') = '***'
DoubleToStr(0.55,'666') = '0'
Обязательная (значимая) цифра целой части:

DoubleToStr(5,'777') = '005'
DoubleToStr(55,'777') = '055'
DoubleToStr(555,'777') = '555'
DoubleToStr(5555,'777') = '***'
Обязательная (значимая) цифра дробной части:

DoubleToStr(5.55,'77.88') = '05.55'
DoubleToStr(5.555,'77.88') = '05.55'
DoubleToStr(5.555,'\2p77.88') = '05.56'
   // для округления до N знаков следует воспользоваться \Np
DoubleToStr(5.5,'77.88') = '05.50'
DoubleToStr(5.599,'\2p77.88') = '05.60'
Необязательная (незначимая) цифра дробной части:

DoubleToStr(5.55,'77.99') = '05.55'
DoubleToStr(5.555,'77.99') = '05.55'
DoubleToStr(5.555,'\2p77.99') = '05.56'
DoubleToStr(5.5,'77.99') = '05.5'
DoubleToStr(5.599,'\2p77.99') = '05.6'
Если необходимо, чтобы в дробной части всегда выводилось не менее к примеру 2 знаков, поступаем следующим образом:

DoubleToStr(5.599,'7.8899') = '5.599'
DoubleToStr(5.59,'7.8899') = '5.59'
DoubleToStr(5.9,'7.8899') = '5.90'
Окруление:

DoubleToStr(55.555,'\2p66.99') = '55.56'
   // \2p - 2 знака после запятой
DoubleToStr(55.555,'\1p66.99') = '55.6'
   // \1p - 1 знак после запятой
DoubleToStr(55.555,'\0p66.99') = '55'
   // \0p - округления до целого
DoubleToStr(55.555,'\-1p66.99') = '60'
   // \-1p - округления до десятков
Мужской /женский род:

DoubleToStr(22.22,'\m4 РУБЛЯ \f5') =
   'двадцать два РУБЛЯ двадцать две сотых'
Программист-самоучка
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Re: Текстовое представление числа

Сообщение Maverick »

Тогда уж лучше просто юзать DoubleToString :)
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Ответить