Страница 1 из 1

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

Добавлено: 13 фев 2015, 10:34
Marisha_P
Подскажите, пожалуйста, как вывести прописью числа.
Вывод должен быть в формате: "Всего: одна тонна, десять штук"
стандартным doubletostr не получится? ведь могут быть и целые числа и дробные.. и род числа может быть разным - штука, комплект

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

Добавлено: 13 фев 2015, 11:33
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 коп.'  двадцать один руб. двадцать два сотых коп.
Более подробно написано в хелпе, в статье "Формат преобразования вещественных чисел в строку"

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

Добавлено: 16 фев 2015, 10:12
Marisha_P
это я тоже нашла.. а если 10,5855 тонн, то как расписать 10 т 585 кг 500 г ?:)

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

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

Если такой подход не устраивает, всегда можно самостоятельно нужную ф-ю наваять или заюзать ту, которую нашли в инете и она Вас устраивает.
В первом случае - реализуется на ВИПе.
В последнем - главное условие: чтобы найденная ф-я содержалась в какой нить - DLL, которую можно зарегистрировать в ВИП

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

Добавлено: 16 фев 2015, 13:47
Zver
Больше похоже на костыль, но может получится так:

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

а затем в полученной строке заменяем денежные единицы на нужные строковыми функциями?

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

Добавлено: 16 фев 2015, 13:58
Marisha_P
а какая функция так разбирает по цифрам? в doubletostr всегда будет разрядность в наименовании

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

Добавлено: 16 фев 2015, 16:55
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') =
   'двадцать два РУБЛЯ двадцать две сотых'

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

Добавлено: 16 фев 2015, 20:18
Maverick
Тогда уж лучше просто юзать DoubleToString :)