Текстовое представление числа
Модераторы: m0p3e, edward_K, Модераторы
Текстовое представление числа
Подскажите, пожалуйста, как вывести прописью числа.
Вывод должен быть в формате: "Всего: одна тонна, десять штук"
стандартным doubletostr не получится? ведь могут быть и целые числа и дробные.. и род числа может быть разным - штука, комплект
Вывод должен быть в формате: "Всего: одна тонна, десять штук"
стандартным doubletostr не получится? ведь могут быть и целые числа и дробные.. и род числа может быть разным - штука, комплект
-
- Абориген
- Сообщения: 943
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: External Developer
- Контактная информация:
Re: Текстовое представление числа
Ну почему же... 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: Текстовое представление числа
это я тоже нашла.. а если 10,5855 тонн, то как расписать 10 т 585 кг 500 г ?:)
-
- Абориген
- Сообщения: 943
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: External Developer
- Контактная информация:
Re: Текстовое представление числа
Ну, по видимому, должен быть конгломерат вычислений.
На мой взгляд самый простой способ такой:
1. Сначала анализируем длину дробной части выражения,
2. потом - первую часть вычисляем стандартно через DoubleTo Str,
3. хвостик - самостоятельно.
Ф-я то расчитана только на преобразование целой и дробной части, без учета рекурсии вхождения одних едИзм в другие...
Если такой подход не устраивает, всегда можно самостоятельно нужную ф-ю наваять или заюзать ту, которую нашли в инете и она Вас устраивает.
В первом случае - реализуется на ВИПе.
В последнем - главное условие: чтобы найденная ф-я содержалась в какой нить - DLL, которую можно зарегистрировать в ВИП
На мой взгляд самый простой способ такой:
1. Сначала анализируем длину дробной части выражения,
2. потом - первую часть вычисляем стандартно через DoubleTo Str,
3. хвостик - самостоятельно.
Ф-я то расчитана только на преобразование целой и дробной части, без учета рекурсии вхождения одних едИзм в другие...
Если такой подход не устраивает, всегда можно самостоятельно нужную ф-ю наваять или заюзать ту, которую нашли в инете и она Вас устраивает.
В первом случае - реализуется на ВИПе.
В последнем - главное условие: чтобы найденная ф-я содержалась в какой нить - DLL, которую можно зарегистрировать в ВИП
-
- Местный житель
- Сообщения: 204
- Зарегистрирован: 13 ноя 2012, 12:47
- Откуда: СПб
- Контактная информация:
Re: Текстовое представление числа
Больше похоже на костыль, но может получится так:
10,5855 тонн в 10 тыс 585 руб 500 коп,
а затем в полученной строке заменяем денежные единицы на нужные строковыми функциями?
10,5855 тонн в 10 тыс 585 руб 500 коп,
а затем в полученной строке заменяем денежные единицы на нужные строковыми функциями?
Программист-самоучка
Re: Текстовое представление числа
а какая функция так разбирает по цифрам? в doubletostr всегда будет разрядность в наименовании
-
- Местный житель
- Сообщения: 204
- Зарегистрирован: 13 ноя 2012, 12:47
- Откуда: СПб
- Контактная информация:
Re: Текстовое представление числа
Из документации (особенно раздел "Текстовое представление дробной части:"):
Код: Выделить всё
Вывод знака числа:
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') =
'двадцать два РУБЛЯ двадцать две сотых'
Программист-самоучка
-
- Абориген
- Сообщения: 943
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: External Developer
- Контактная информация:
Re: Текстовое представление числа
Тогда уж лучше просто юзать DoubleToString