09.06.2007, 15:33
|
#4
|
Участник
Регистрация: 28.11.2005
Адрес: Москва
|
Цитата:
Сообщение от Владимир Максимов
А каким способом экспортируете данные? Может, Excel тут вообще не при чем, а виноват способ передачи данных?
Например, использование strFmt("%1",0.099) автоматически проведет округление, поскольку использует текущие региональные настройки системы.
Кстати, да, тоже сталкивался с таким «эффектом» использования strfmt(), когда надо было выводить лог изменений в полях таблицы при импорте данных. Для strfmt() можно использовать примерно такой код (пример переделан из класса обновления InventTable, но легко можно сделать поддержку произвольных таблиц):X++: class smth
{
// map <InventTable fieldId> -> [<fieldName>, <baseType>, <noOfDecimals>]
Map mapFieldData;
}
void printField(InventTable _inv, FieldId _fieldId)
{
DictField dictField;
SysDictType dictType;
Types baseType;
int nDecimals;
str strFldName;
str strValue;
;
// cache field information
if(!mapFieldData) mapFieldData = new Map(Types::Integer, Types::Container);
if(!mapFieldData.exists(_fieldId))
{
dictField = new DictField(_inv.tableId, _fieldId);
dictType = new SysDictType(dictField.typeId());
strFldName = dictField.name();
baseType = dictField.baseType();
nDecimals = dictType.noOfDecimals();
mapFieldData.insert(_fieldId, [strFldName, baseType, nDecimals]);
} else
[strFldName, baseType, nDecimals] = mapFieldData.lookup(_fieldId);
switch(baseType)
{
// print as many decimals as it's set up in the EDT
case Types::Real: strValue = num2str(_inv.(_fieldId),1,nDecimals,1,0);
break;
default : strValue = strfmt('%1',_inv.(_fieldId));
}
info(strfmt(@"For item '%1 - %2' %3 value: %5%4%5",
inv.ItemId, inv.itemName(), strFldName, strValue,
(baseType == Types::String ? @"'" : '')));
}
|
|