ThousandSeparator — Переменная Delphi

Почему FloatToStr игнорирует ThousandSeparator?

5 Svip [2014-07-03 13:04:00]

Я пытаюсь преобразовать Double и/или Currency в строку для использования в SQL-вызове. Это означает, что я всегда заинтересован в ThousandSeparator , являющемся ничем, и DecimalSeparator является «.».

Конечно, так как мой язык машины настроен на датский, Windows вернет ‘.’ для ThousandSeparator и ‘,’ для DecimalSeparator . Поэтому мне нужно компенсировать очень вероятный случай неправильной локализации.

Кроме того, мой код должен работать как в D2007 (по устаревшим причинам), так и в XE3. Таким образом, код выглядел так:

Конечно, можно утверждать, что, поскольку мы предполагаем, что FloatToStr использовать только TFormatSettings ‘ ThousandSeparator и DecimalSeparator , создавая его с любой локалью, было бы бессмысленно, поскольку мы все равно их переписываем.

Тем не менее, я думал, что это очень много кода для очень простой операции. Я тоже не был поклонником ThousandSeparator быть ‘?’ а затем удаляется с помощью StringReplace() . Но поскольку ThousandSeparator является char , он фактически не может быть пустым.

Я проверил несколько тестов на FloatToStr и FloatToStrF , и в этот момент я заметил, что TFormatSettings.ThousandSeparator был полностью проигнорирован:

Я ожидаю, что каждый результат будет «1W234W567.8901», но вместо этого он был всего лишь «1234567.8901». Поэтому я задаюсь вопросом, ожидаются ли это поведение или странность.

Потому что, даже если я не могу избежать TFormatSettings , если я могу хотя бы игнорировать ThousandSeparator , я полагаю, что я бы сохранил две строки кода (не так уж важно, я полагаю), но будет ли это безопасно это сделать? Могу ли я всегда ожидать FloatToStr игнорировать ThousandSeparator ?

Просветите, почему ThousandSeparator = #160

>andreymxСамый грамотный подход — открыть документацию по принтеру и почитать про систему команд.Оттуда и поймёшь, как и что надо делать.

Ну для начала о явлении: это не ошибка и не некорректная обработка символа,я уже когда-то запрашивал завод об этом.Дело в том, что в Епсоновской эмуляции этот символ (255) являетсявспомогательным и не определен жестко (либо он выполняет забой, либопробел). То, как тот или иное устройство его обрабатывает, не есть стандарт,это отдано на усмотрение разработчиков, а те делают микрокод сообразнонаиболее часто (из опыта своих клиентов) встречающейся потребности, потомуздесь действительно запрограммировано, чтобы принтер выполнял «забой» или»возврат на шаг».Что делать? — несколько вариантов.1. Не использовать 160 при формировании исходных текстов, а использоватьобычный 32.2. Если первое по какой-то причине никак не сделать, то использоватьпроцедуру перекодировки, которая бы вставляла #32 вместо вындовического#160.Все равно ни один принтер не может понимать, что такое «неразрывный пробел»,он печатает посылаемый на него поток, и обработку ситуации (перенос группысимволов с неразрывным пробелом, если она не помещается в строку) выполняетведь приложение, а не принтер (приложение, которое растеризует данные и/илипосылает их на принтер). Тем более что когда вы преобразовали текст в ASCII,то там уже точно все равно.Если переделать процедуру сложно, то можно сделать свою, или сделать свойочень простой перекодировщик, который напускается на текст с однойзадачей — 255 заменить на 32.Сообщите, сможете ли Вы задействовать такой путь, пожалуйста.АК

Undeclared >02.02.2013, 14:27. Просмотров 12356. Ответов 16

Здравствуйте.
Пытаюсь написать программку, в которой в первое поле будет вводиться текст, во второе целое , в третье дробное число.

Илон Маск рекомендует:  Что такое код asp @language

Вот ошибки:
[dcc32 Error] Unit1.pas(61): E2003 Undeclared identifier: ‘DecimalSeparator’
[dcc32 Error] Unit1.pas(62): E2250 There is no overloaded version of ‘Pos’ that can be called with these arguments
[dcc32 Warning] Unit1.pas(62): W1058 Implicit string cast with potential data loss from ‘TCaption’ to ‘ShortString’
[dcc32 Fatal Error] Project1.dpr(5): F2063 Could not compile used unit ‘Unit1.pas’

Как я понял, он не понимает переменную ‘DecimalSeparator’.

отказ Дельфи xe5 StrToFloat изменения ThousandSeparator к «»

Что я делаю неправильно здесь? Я просто хочу, чтобы преобразовать отформатированную строку в двойных и используя TFormatSettings переданного в качестве параметра StrToFloat. Я получаю следующее исключение:

Замостить и десятичного разделителя ожидаемые значения ( «» и «») в TFormatSettings.

Такое поведение , как задумано. Из документации , с моим акцентом:

Используйте StrToFloat, чтобы преобразовать строку, S, к значению с плавающей точкой. S должна состоять из необязательного знака (+ или -), строки цифр с необязательной десятичной точкой и необязательной мантиссы. Мантиссы состоят из «E» или «E» с последующим необязательным знаком (+ или -) и целым числом. Начальные и конечные пробелы игнорируются.

Глобальная переменная DecimalSeparator или ее эквивалента TFormatSettings определяет символ , который используется в качестве десятичной точки. Thousand сепараторы и символы валюты не допускаются в строке . Если S не содержит действительное значение, StrToFloat вызывает исключение EConvertError.

Так что это ошибка передать строку, содержащую разделитель тысяч к этой функции.

То , что вы здесь делаете правильно, но вы наткнулись на то , что, кажется , ошибка (если не ошибка по крайней мере, не очень последовательное поведение) от TextToFloat (кажется , что он игнорирует ThousandSeparator) внутреннюю функцию блока Delphi SysUtils (взять смотреть на Q92265 следовать резолюции) .

В качестве временного решения можно попробовать удалить разделитель группы, таким образом:

Ошибка delphi xe5 StrToFloat, изменяющая ThousandSeparator на ‘,’

Что я здесь не так делаю? Я просто хочу преобразовать отформатированную строку в двойную, используя TFormatSettings, переданный в качестве параметра StrToFloat. Я получаю следующее исключение:

Разделитель тысяч и десятичный разделитель являются ожидаемыми значениями (‘,’ и ‘.’) в TFormatSettings.

1 ответ

То, что вы делаете здесь, правильно, но вы наткнулись на то, что кажется ошибкой (если не ошибкой, по крайней мере, не очень последовательным поведением) внутренней функции TextToFloat (кажется, она игнорирует ThousandSeparator) модуля Delphi SysUtils (взгляните на Q92265 , чтобы следовать резолюции) .

В качестве обходного пути вы можете попробовать удалить разделитель группы следующим образом:

ThousandSeparator — Переменная Delphi

cjc Posted at 2011-5-19 18:25

show numbers with thousand separators?

Title: show numbers with thousand separators?

function AddThousandSeparator(S: string; Chr: Char): string;
var
I: Integer;
begin
Result := S;
I := Length(S) — 2;
while I 1 do
begin
Insert(Chr, Result, I);
I := I — 3;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := AddThousandSeparator(‘400500210’, »»);
// — 400’500’210
end;

// Other possibility / andere M glichkeit: ThousandSeparator := »»;

label1.Caption := FormatFloat(‘#,###,###.###’, 23453452);

Delphi 2006. Справочное пособие: Язык Delphi, классы, функции Win32 и .NET. — Архангельский А.Я.

Ниже приведен перечень открытых полей записи. Они доступны только для чтения.

Поле Описание
Epsilon Минимальное по модулю значение данных.
MaxValue Максимальное значение данных (см. приведенную выше таблицу).
MinusOne Число — Ib формате Decimal. Decimal — запись монетарных данных в NFCL

Поле Описание
MinValue Минимальное значение данных.
One Число 1 в формате Decimal.
Zero Число О в формате Decimal.
Методы Ниже приведен перечень открытых методов записи.
Метод Описание
Add Складывает два заданных значения Decimal и возвращает полученную сумму.
Compare Сравнивает значения двух указанных объектов Decimal.
і CompareTo Сравнивает значение данного экземпляра с указанным в качестве параметра.
Decimal Конструктор.
Divide Делит два заданных значения Decimal и возвращает полученное частное.
Equals Возвращает true, если указанный объект и данный объект содержат одинаковые значения.
Floor Возвращает значение, округленное до ближайшего целого в сторону отрицательной бесконечности.
FromOACurrency Преобразует целое значение Currency в формате OLE Automation в тип Decimal.
GetBits Преобразует значение типа Decimal в массив 32-битных целых, содержащий по отдельности младшие, средние, старшие разряды целого, и характеристики знака и степени масштабирующего коэффициента.
GetHashCode Возвращает хеш-код объекта, используемый в алгоритмах хеширования и в структурах хешированных таблиц.
GetTvpe Возвращает тип объекта в виде объекта класса Туре.
GetTvpeCode Возвращает тип указанного объекта в виде элемента перечисления TvpeCode.
j Multiply Умножает два заданных значения Decimal и возвращает полученное произведение.
Negate Возвращает значение Decimal, умноженное на -1.
Parse Преобразует текст строки в значение данного типа.
Remainder Возвращает остаток от деления двух значений Decimal.
Round Осуществляет округление значения Decimal с точностью до указанного числа разрядов. 512

Илон Маск рекомендует:  Как сделать, чтобы цвет маркеров в списке отличался от цвета текста

Г лава 9 > Некоторые базовые классы, типы, переменные

I і Метод Описание
Subtract Вычитает два заданных значения Decimal и возвращает полученную разность
ToByte Приводит значение Decimal к типу Bvte с округлением в сторону нуля.
ToDouble Приводит значение Decimal к THnv Double.
. .
ToString Преобразует значение данного типа в строку.
. .
Truncate Осуществляет округление значения Decimal до ближайшего целого с торону нуля.

Имеются также методы вида ToDouble (отмечены в таблице многоточиями), осуществляющих приведение типа Decimal к типам Intl6, Int32, Int64, OACurrency, SByte, Single, UIntl6, UInt32, UInt64. Определены операции приведения всех перечисленных типов к типу Decimal, арифметические операции, операции отношения.

Кроме того, имеются защищенные методы Finalize и MemberwiseClone.

DecimalSeparator, ThousandSeparator — переменные VCL

Определяют символы разделителей, используемых в формате отображения чисел

Библиотеки VCL Win32, VCL .NET

Модули в VCL Win32: SysUtilsf в VCL .NET: BorlandVcLSysUtils

type SeparatorType = string;

Глобальная переменная DecimalSeparator определяет при строковом отображении числа символ, разделяющий целую и дробную часть числа. По умолчанию в русской локализации это символ запятой, но можно заменить его, например, символом точки.

Глобальная переменная ThousandSeparator указывает символ, разделяющий тысячи (точнее, каждые три цифры). Значение #0 соответствует отсутствию разделителя.

Значение переменной DecimalSeparator влияет на форматированное отображение любых действительных величин. Значение переменной ThousandSeparator, Default8087CW — переменная VCL Win32

судя по документации, также должно влиять на отображение любых величин, но реально влияет, прежде всего, на отображение монетарных значений (см. разд. «CurrencyFormat и другие переменные VCL, определяющие форматирование монетарных значений»).

Default8087CW — переменная VCL Win32

Содержит значение по умолчанию управляющего слова FPU Библиотек VCL Win32 Модуль System Синтаксис

var Default8087CW: Word;

Переменная Default8087CW содержит значение по умолчанию управляющего слова FPU (см. разд. 2.8.3 и разд. 11.1.6). Это слово управляет точностью, округлением и генерацией исключений при выполнении операций с плавающей запятой.

Слово может устанавливаться процедурой Set8087CW. Например:

DialogResult — перечисление NFCL

Определяет значение, возвращенное диалоговым окном Библиотека NFCL

Пространство имен SystemWindows.Forms Описание

Перечисление DialogResult содержит элементы, определяющие значение, которое вернулось из диалогового окна. Это перечисление используется в свойстве DialogResult кнопок Button, в методе ShowDialog форм Form, в методе Show класса MessageBox. Перечисление содержит следующие элементы:

ThousandSeparator — Переменная Delphi

cjc Posted at 2011-5-19 18:25

show numbers with thousand separators?

Title: show numbers with thousand separators?

function AddThousandSeparator(S: string; Chr: Char): string;
var
I: Integer;
begin
Result := S;
I := Length(S) — 2;
while I 1 do
begin
Insert(Chr, Result, I);
I := I — 3;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := AddThousandSeparator(‘400500210’, »»);
// — 400’500’210
end;

Илон Маск рекомендует:  Sqlтета соединение таблиц

// Other possibility / andere M glichkeit: ThousandSeparator := »»;

label1.Caption := FormatFloat(‘#,###,###.###’, 23453452);

Почему FloatToStr игнорирует ThousandSeparator?

Я пытаюсь преобразовать Double и/или Currency в строку для использования в SQL-вызове. Это означает, что я всегда заинтересован в ThousandSeparator , являющемся ничем, и DecimalSeparator является «.».

Конечно, так как мой язык машины настроен на датский, Windows вернет ‘.’ для ThousandSeparator и ‘,’ для DecimalSeparator . Поэтому мне нужно компенсировать очень вероятный случай неправильной локализации.

Кроме того, мой код должен работать как в D2007 (по устаревшим причинам), так и в XE3. Таким образом, код выглядел так:

Конечно, можно утверждать, что, поскольку мы предполагаем, что FloatToStr использовать только TFormatSettings ‘ ThousandSeparator и DecimalSeparator , создавая его с любой локалью, было бы бессмысленно, поскольку мы все равно их переписываем.

Тем не менее, я думал, что это очень много кода для очень простой операции. Я тоже не был поклонником ThousandSeparator быть ‘?’ а затем удаляется с помощью StringReplace() . Но поскольку ThousandSeparator является char , он фактически не может быть пустым.

Я проверил несколько тестов на FloatToStr и FloatToStrF , и в этот момент я заметил, что TFormatSettings.ThousandSeparator был полностью проигнорирован:

Я ожидаю, что каждый результат будет «1W234W567.8901», но вместо этого он был всего лишь «1234567.8901». Поэтому я задаюсь вопросом, ожидаются ли это поведение или странность.

Потому что, даже если я не могу избежать TFormatSettings , если я могу хотя бы игнорировать ThousandSeparator , я полагаю, что я бы сохранил две строки кода (не так уж важно, я полагаю), но будет ли это безопасно это сделать? Могу ли я всегда ожидать FloatToStr игнорировать ThousandSeparator ?

Функции и процедуры Delphi. Справочник.

Функция FloatToStrF(
Value: Extended;
Format: TFloatFormat;
Precision, Digits: Integer ): string;

type TFloatFormat =
(ffGeneral, ffExponent, ffFixed, ffNumber, ffCurrency);

Описание
Функция преобразовывает число с плавающей запятой Value в его строковое представление, используя заданный формат. Параметр Precision определяет количество знаков в результирующем значении, которое должно находиться в следующих пределах:

Тип Precision Тип Precision Тип Precision
Single =0.00001. В противном случае, применяется научный формат, а параметр Digits определяет минимальное число цифр в экспоненте (0.. 4).
ffExponent Научный формат. Число преобразуется в строку формата
«-x.xxx…E+xxxx». Строка начинается со знака «-» (если число отрицательное). Десятичной точке всегда предшествует одна цифра. Параметр Precision определяет общее количество десятичных цифр, стоящих до символа экспоненты «E» (включая цифру слева от десятичного разделителя). За символом экспоненты следует знак плюс или минус и до 4 цифр, определяющих степень экспоненты. Минимальное число цифр в экспоненте указывается в параметре Digits.
ffFixed Фиксированный формат. Значение преобразуется в строку вида «-ххх.ххх…». Если число отрицательное, то впереди строки будет поставлен знак «-«. Десятичной точке всегда предшествует минимум одна цифра. Количество значащих цифр после десятичной точки (0…18) указывается в параметре Digits. Если количество разрядов слева от разделителя превышает значение, указанное в параметре Precision, то для форматирования будет использоваться научный формат (ffExponent).
ffNumber Числовой формат. Значение будет преобразовано в строку следующего вид «-х,ххх,ххх.ххх…». Данный формат аналогичен формату ffFixed, за исключением того, что полученная строка будет содержать еще и разделители тысяч.
ffCurrency Денежный формат. Значение преобразовывается в строку, представляющую денежную величину. Количество значащих цифр после десятичной точки (0…18) определяется параметром Digits. Преобразование управляется глобальными переменными CurrencyString, CurrencyFormat, DecimalSeparator NegCurrFormat и ThousandSeparator, значения которых устанавливаются в диалоговом окне ‘Язык и стандарты’ панели управления Windows.

Пример
var
Sum: Extended;
SumStr: string;
begin
Sum:= 10255.2;
SumStr:= FloatToStrF( Sum, ffCurrency,18,2);
MessageDlg( SumStr, mtInformation, [mbOk], 0);
end;

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL