Формат Float - как взять системные установки?

Есть поле Calculate типа String.
Ему присваиваются значения :

if (Dataset.ValAsFloat('PriceMax10') == 0)  Dataset.Values('Oct') = '';
else Dataset.Values('Oct') = FloatFormat(Dataset.ValAsFloat('PriceMax10'),' ',',',2);

Но моем компьютере - все ок. Остальные поля типа Float тоже отображаются с ",".
А вот у коллеги на компьютере другой формат. У него все поля типа Float отображаются с "."
В результате на экране видны и цифры с точками и с запятыми.
Можно как-то привести все это к единому формату?

Нравится

19 комментариев

Наталия, отображение разделителей определяется системными настройками Windows:

Панель управления - Язык и региональные настройки - Дополнительно:

decimal

Это я знаю. :)
Вопрос был - можно ли узнать непосредственно в Террасофте системные установки, чтобы метод FormaFloat брал или запятую или точку - в зависимости от системных установок.

тогда пропадает смысл в FloatFormat используйте RoundFloatValue(FloatValue, Precision)

"Андросов Дмитрий" написал:RoundFloatValue(FloatValue, Precision)

Попробовала. Несмотря на указание Precision все равно обрезаются цифры после запятой. Получаю 20 вместо 20,00.

Поясню еще раз :
Dataset.Values('Oct') - типа Calc(String)
Dataset.Values('PriceMax10') - типа Float

Все эти "превращения" делают для того, чтобы по просьбе клиента в случае нулевых сумм не показывать 0, а пустоту.

MessageBox(RoundFloatValue(Dataset.ValAsFloat('PriceMax01'), 2));

дает
0
0,45
20
Такое ощущение, что функциональность не срабатывает

Она срабатывает, но не предусматривает контроля количества знаков после запятой.
Я раскопал, что запятые как разделитель (со значением системной настройки) появляются только на уровне окон (карточки, гриды и т.д.), а sql, JS и датасеты работают с точками - поэтому RoundFloatValue и ей подобные могут дать вам только точку, а FloatFormat - только то, что вы ей определите.

Не нашел как из скриптов взять системную настройку. Вернее, нашел методы System.GetSystemSettingValue() и System.GetSystemSettingValueDef(), но не уверен, относительно того, как они работают, что возвращают и можно ли с их помощью взять то, что нужно

Формат разделителя настроить в Terrasoft нельзя - он подтягивается из операционной системы.

Установить количество знаков после запятой, отображаемых в элементе управления или реестре можно - для этого в датасете есть поле Precision:

Нельзя настроить - это понятно. Вопрос в том, можно ли его узнать? Зная его можно будет подставить в FloatFormat системную настройку и CalcField типа String не будет выбиваться из общего стиля)

У меня поле типа Calc - String. Потому вариант
-для этого в датасете есть поле Precision
мне совсем не подходит.

Наталия, узнать формат десятичного разделится средствами jscript можно так:

.2.toLocaleString().substr(1,1)

А вообще, если установить для поля датасета галку UseFixedFloatPart, не будет нужды использовать функцию FloatFormat.

Спрошу тогда здесь. В принципе все проблемы у меня решаются, если я буду использовать поле типа Calc Float. Но ! Тогда вопрос - можно ли для Float вместо пустых значений выводить пустоту, а не ноль? Если решить эту проблему, а именно она решалась с помошью типа Calc String, то все будет работать как надо.

Да, можно. Для этого надо присвоить полю значение

parseFloat(NaN);

это аналог null для чисел с плавающей запятой.

Переделала Calc string на Calc Float, в коде написала

if (IsEmptyValue(Dataset.Values('Payment01')))
{
   MessageBox('null');
   Dataset.Values('Jan') = parseFloat(NaN);
   MessageBox(Dataset.Values('Jan'));
}

В условие попадаю. И в результате вижу все равно "0"....

попробуйте Dataset.ValAsFloat а заодно и Dataset.DataFields.ItemsByName('sdfs').Value

Попробовала

Dataset.DataFields.ItemsByName('Jan').Value = parseFloat(NaN);

и

Dataset.ValAsFloat('Jan').Value = parseFloat(NaN);

- все равно выдает 0

Здравствуйте, Наталья!

Уточните, пожалуйста, куда Вы пытаетесь выводить полученное значение? Есть вероятность, что при выводе значения оно неявно приводится к типу контрола, куда оно выводится.

Кроме того, что показывает отладчик?

Полученое значения я вывожу на экран, в грид.

Красным я подчеркнула колонку, которую я переделала с Calc string в Calc float, и вместо 0,00 там должно быть пусто. Зеленым - колонка, где остался тип Calc string - там и есть пусто, если нет значения.

С отладчиком я не умею работать.

Здравствуйте, Наталья!

Дело в том, что все вычисляемые значения при выводе в реестр преобразуются к строке. А нулевое значение в поле типа Float при преобразовании в строку дает 0

В данном случае выходом будет сделать в реестре вычисляемое поле типа строка, и заменять нули пустыми значениями.

Анна, дело в том, что именно так я и делала с самого начала. Я использую поле Calc String для вывода данных. Изначально я пришла сюда с такой проблемой - для отображения в поле типа Calc String числа с двумя знаками после запятой, я использую метод

Dataset.Values('Oct') = FloatFormat(Dataset.ValAsFloat('PriceMax10'),' ',',',2);

который ВСЕГДА выдает число с "запятой". В то время как на компьютере у пользователя, в зависимости от системных установок, в качестве отделения десятых частей может использоваться и "точка". И речь шла не о смене системных настроек у пользователя, а о возможности МНЕ узнать системные настройки пользователя и подстроиться под них, т.е. для "точки" использовать

Dataset.Values('Oct') = FloatFormat(Dataset.ValAsFloat('PriceMax10'),' ','.',2);

Но на данный момент мы отложили этот вопрос, и оставили все как есть. Сюда по всему, на мой вопрос не существует решения/ответа.

"Alimova Anna" написал:

Наталия, узнать формат десятичного разделится средствами jscript можно так:

.2.toLocaleString().substr(1,1)


Наталия, а вы это попробовали? У меня работает :twisted:

Показать все комментарии