Форум: "Прочее";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизDecimalSeparator опять Найти похожие ветки
← →
Галинка © (2007-08-08 12:14) [0]Была тема, про независимость ввода точки/запятой в качестве десятичного разделителя. Найти не могу. Теперь вот понадобилось. Может кто что посоветует?
← →
homm © (2007-08-08 12:19) [1]
str_replace(",", ".", str);
не подходит?
← →
umbra © (2007-08-08 12:24) [2]
> независимость ввода точки/запятой в качестве десятичного
> разделителя
ввода куда?
← →
Игорь Шевченко © (2007-08-08 12:25) [3]
> ввода куда?
туда
← →
простой (2007-08-08 12:27) [4]А может просто в onCreate DecimalSeparator := "."
← →
Галинка © (2007-08-08 12:27) [5]маразма какой-то вообще. У меня на машине вроде конвертит. Но если с точкой, то конвертит в целое (!). На другой машине выдает сообщшение од ошибке о нелигитимности строки ((
Реплэйс попробую. Если он точку не найдет, то просто ничего и не заменит?
ПыСы: что-то я сегодня мнительная ((
← →
Галинка © (2007-08-08 12:29) [6]ввода в текст бокс строкового предстваления числа типа float.
← →
Kolan © (2007-08-08 12:56) [7]> str_replace(",", ".", str);
>
> не подходит?str_replace(",", DecimalSeparator , str);
str_replace(".", DecimalSeparator , str);
Не не оно?
← →
Reindeer Moss Eater © (2007-08-08 13:09) [8]Если введена точка или запятая и это не децималсепаратор, заменить на него. Плюс контроль на их общее количество.
← →
Галинка © (2007-08-08 13:15) [9]Reindeer Moss Eater © (08.08.07 13:09) [8]
контроль на общее кол-во ИМХО не совсем нужен, так есть вообше проверка на возможность конвертации. Типа:private void tbGasDruck_Leave(object sender, EventArgs e)
{
try
{
this.tbGasDruck.Text.Replace(".", ",");
Convert.ToDouble(this.tbGasDruck.Text);
}
catch (FormatException fe)
{
MessageBox.Show("Falsche Format der Datei !!!" + fe.Message);
tbGasDruck.Focus();
tbGasDruck.SelectAll();
}
}
И вот еще момент. Приниматься должно с запятоц или точкой, а вот выходные числа в XML должны с точкой уходить.
← →
Reindeer Moss Eater © (2007-08-08 13:22) [10]А зачем в XML обязательно с точкой?
TXMLDocument работает через варианты, пусть сам заморачивается как хочет.
← →
Юрий Зотов © (2007-08-08 13:26) [11]> Галинка © (08.08.07 12:27) [5]
> маразма какой-то вообще. У меня на машине вроде конвертит. Но если с
> точкой, то конвертит в целое (!).
Никакого маразма - в системе точка установлена, как GroupSeparator.
← →
Reindeer Moss Eater © (2007-08-08 13:27) [12]Вообще, если не на этапе ввода, то я такую задачу решал регулярными выражениями. Но до конца её не решить. Именно из за разделителей тысяч.
← →
Галинка © (2007-08-08 13:40) [13]Reindeer Moss Eater © (08.08.07 13:22) [10]
потому как этот XML является исходником для другой проги. А она понимает только точку в качестве десятичного разделителя ))
Юрий, спасибо за разъяснения.
← →
Плохиш © (2007-08-08 14:00) [14]
> Галинка © (08.08.07 13:40) [13]
> Reindeer Moss Eater © (08.08.07 13:22) [10]
>
> потому как этот XML является исходником для другой проги.
> А она понимает только точку в качестве десятичного разделителя
Есть подозрение, что та программа использует стандартные средства/компоненты для работы с xml, не какие-то доморощенные...
← →
Галинка © (2007-08-08 14:13) [15]Плохиш © (08.08.07 14:00) [14]
не знаю. Есть подозрение, что коллеги влом бороться с такими ошибками. А матлаб, которому скармливается этот XML понимает точно только десятичную точку.
← →
lookin © (2007-08-08 14:22) [16]> [15] Галинка © (08.08.07 14:13)
матлаб, которому скармливается этот XML понимает точно только десятичную точку
Мир бесконечен. У меня Матлаб жрет только запятую в качестве разделителя))...
А в качестве решения(?) проблемы ограничения ввода чего-нибудь в текстбокс такое подойдет?
function AnyTextToNumberText(Source: string; Delimiter: char): string;
var i: integer;
begin
Result:="";
for i:=1 to Length(Source) do
if Pos(Source[i],"1234567890-+"+Delimiter)<>0 then
Result:=Result+Source[i];
end;
← →
Паша 1 (2007-08-08 14:25) [17]
> Галинка ©
не пойму, почему не установить точку на старте, шо уже советовали выше. и пускай вводят с точкой. у меня не один десяток клиентов и нареканий нет, и уже не один год. такой вот я противный, хочу, шоб вводили с точкой. и будут вводить.
← →
Галинка © (2007-08-08 14:42) [18]Паша 1 (08.08.07 14:25) [17]
в смысле? Как понять установить точку на входе? Вот что у меня на входе:nfi = new CultureInfo("en-US", false).NumberFormat;
nfi.NumberDecimalSeparator = ".";
int[] curSize = { 0 };
nfi.NumberGroupSizes = curSize;
это для дальнейших конвертаций введеных данных с точкой.
Но когда пользователь что-то типает в текстбоксе, то можно и точку и запятую ставить.
← →
Котик Б (2007-08-08 14:46) [19]Галинка © - а может вам того... детишек порожать ? Ну их эти точки, сепараторы и т.п. ... :) (это смайлик)
← →
Reindeer Moss Eater © (2007-08-08 14:52) [20]Гы :)
private static string get_right_number_str(string AValue, string separator)
{
Regex re = new Regex(@"(,|\.)"); //ищем точки и запятые в переданной строке
if (re.IsMatch(AValue))
{
Match m = re.Match(AValue);
int grps = m.Groups.Count; //Если в строке есть и точка и запятая, вернет "2" иначе "1"
MatchCollection mc = re.Matches(AValue);
int occrs = mc.Count; //Общее количество вхождений точек и запятых
if (m.Groups.Count == 1) //найдена только точка или только запятая
{
//Если вхождений ровно одно, то это наверняка разделитель дробной и целой части (а как быть если 325,000 - в смысле "325 тысяч")
if (occrs == 1)
return re.Replace(AValue, separator); //заменяем на валидный сепаратор
else
//Если вхождений несколько, то это разделитель тысяч (убираем их всех)
return re.Replace(AValue, "");
}
else
{
//Найдена и точки и запятые одновременно
string buff = re.Replace(AValue, "", --occrs, 1); //Убираем все, кроме последней
return re.Replace(buff, separator); //Последнюю меняем на сепаратор
}
}
else
return AValue;
}
← →
Паша 1 (2007-08-08 14:53) [21]
> Галинка © (08.08.07 14:42) [18]
мы о чем говорим? о дельфях? ну, тогда уже написанно простым языко, шо надо делать в нумере [4]. только не на ОнКреате, на старте проекта. там же полезно и с датами разрулить. хотя, это на любителя. у меня эта песня в секции initialization забито модуля, который в первой дисятке. гыгы
> Котик Б (08.08.07 14:46) [19]
эт ты зря. все мы учились понемногу, чему нибудь и как нибудь. знавал я женщин-программистов. правда, у них логика интересная, но на качестве продукта не сказывалось.
← →
Галинка © (2007-08-08 14:56) [22]Котик Б (08.08.07 14:46) [19]
детишков уже порожала. Вот теперь надо им на кашку зарабатывать ))
← →
Галинка © (2007-08-08 15:01) [23]Паша 1 (08.08.07 14:53) [21]
я пишу на шарпе в дотнет.
← →
Паша 1 (2007-08-08 15:09) [24]
> Галинка © (08.08.07 15:01) [23]
а. не знаком с таким зверем. но неужто там аналогов нету ДесималСепаратору дельфийскому? в конце-концов анализировать строку при записи, шо тут сложного?
← →
b z (2007-08-08 15:20) [25]
> Галинка ©
NumberFormatInfo ?
← →
Галинка © (2007-08-08 15:22) [26]
> Паша 1 (08.08.07 15:09) [24]
>
>
> > Галинка © (08.08.07 15:01) [23]
>
> а. не знаком с таким зверем. но неужто там аналогов нету
> ДесималСепаратору дельфийскому? в конце-концов анализировать
> строку при записи, шо тут сложного?
>
так вот и анализирую. Принудительно задать DecimalSeparator не получается. Говорит он защищен от записи.
← →
Галинка © (2007-08-08 15:22) [27]b z (08.08.07 15:20) [25]
конечно. Только принудительно задать нельзя.
← →
b z (2007-08-08 15:36) [28]http://msdn2.microsoft.com/en-us/library/system.globalization.numberformatinfo.numberdecimalseparator(vs.71).aspx
там примеры есть
← →
Darvin © (2007-08-08 15:47) [29]> Галинка ©
У меня такая проблема получается, когда я храню в БД или где-то в другом месте числа с плавающей / фиксированной точкой в текстовом виде.
Для себя нашел след. решение:
1. Не хранить числа Real / Double в текстовом виде.
2. При вводе их пользователем осуществлять контроль:
try
StrToFloat(TxtVal);
except
// Сказать пользователю, что он ввел не так
end;
3. Если нужно читать такие числа из текстового файла с неизвестным разделителем - тогда уже анализ текстового представления и установка правильного DecimalSeparator.
4. При экспорте в матлаб принудительно на машине установить DecimalSeparator = ","
← →
umbra © (2007-08-08 16:06) [30]
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (Ord(Key) < $30) or (Ord(Key) > $39) then
Key := DecimalSeparator;
end;
← →
Галинка © (2007-08-08 16:08) [31]
> Darvin © (08.08.07 15:47) [29]
>
> > Галинка ©
> У меня такая проблема получается, когда я храню в БД или
> где-то в другом месте числа с плавающей / фиксированной
> точкой в текстовом виде.
> Для себя нашел след. решение:
> 1. Не хранить числа Real / Double в текстовом виде.
> 2. При вводе их пользователем осуществлять контроль:
> try
> StrToFloat(TxtVal);
> except
> // Сказать пользователю, что он ввел не так
> end;
> 3. Если нужно читать такие числа из текстового файла с неизвестным
> разделителем - тогда уже анализ текстового представления
> и установка правильного DecimalSeparator.
> 4. При экспорте в матлаб принудительно на машине установить
> DecimalSeparator = ","
1. Не храню.
2. Осуществляю.
3. Не нужно.
4. Не ко мне. Это делает коллега. Я вообще в матлабовскую часть не влазию. Поэтому извращаться надо мне.
← →
Галинка © (2007-08-08 16:09) [32]umbra © (08.08.07 16:06) [30]
Бинго. Гильотина. Вместа любого не числового символа, сразу нужный децимал сеператор. Попробую.
← →
umbra © (2007-08-08 16:14) [33]только еще надо разрешить + и - в начале :)
← →
Галинка © (2007-08-08 16:20) [34]umbra © (08.08.07 16:06) [30]
теперь еще бы узнать коды служеюных клавишь )) а то и на Enter/Delete/BackSpace тоже DecimalSeparator ставится
← →
b z (2007-08-08 16:22) [35]
> Галинка © (08.08.07 16:09) [32]
не проще ли MaskedTextBox?
← →
Галинка © (2007-08-08 16:23) [36]вот что получилось (благодаря umbra)
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if ( !char.IsNumber(e.KeyChar) && !char.IsControl(e.KeyChar))
e.KeyChar = nfi.NumberDecimalSeparator[0];
}
← →
Галинка © (2007-08-08 16:46) [37]b z (08.08.07 16:22) [35]
траблематично однако с маской. Если в одно число 500 а другое 56523, то много "пробегать" придется до десятичной запятой. ((
← →
b z (2007-08-08 17:15) [38]
> Галинка © (08.08.07 16:46) [37]
странно, а мне говорили что его придумали для упрощения
вот если пользователь ввел "123i12r3,4", то при вашем способе что произойдет?
> Если в одно число 500 а другое 56523, то много "пробегать"
> придется до десятичной запятой
вот это не понял, если честно ... :(
← →
Галинка © (2007-08-08 17:38) [39]
> b z (08.08.07 17:15) [38]
ну, во-первых, введется "123,12,3,4"; (запятые различаются лучше все же чем буквы, ИМХО)
А во-вторых, выведется сообщение о нелегитимности строки. И фокус передастся в контрол, в котором вылезла ошибка.
> > Если в одно число 500 а другое 56523, то много "пробегать"
> > придется до десятичной запятой
>
> вот это не понял, если честно ... :(
например, маска #####,####. Кому то надо ввести только три цифры в первую часть, а кому-то все пять. Так вот кому надо только три, должен первые два разряда первых оставить незаполненными (хотя вероятно 567 можно представить и как 00567), т.е. "пробежать".
А послезавтра придет человек, у которого площади поверхностей будут семизначными. И как он в пятиразрядную маску воткнет свое семиразрядное число? Не удобно в общем.
← →
umbra © (2007-08-08 17:51) [40]а вот уже более-менее рабочий вариант
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
myEdit: TEdit;
PrevIsDigit: Boolean;
begin
if Sender is TEdit then
begin
myEdit := Sender as TEdit;
PrevIsDigit := (Length(myEdit.Text) > 0) and //
(Ord(myEdit.text[Length(myEdit.Text)]) >= $30) and
(Ord(myEdit.text[Length(myEdit.Text)]) < $40);
if (ord(Key) = 8) or (Ord(Key) = 7) then //
Exit;
if ((Key = "+") or (Key = "-")) and (Length(myEdit.Text) = 0) then
Exit; //
if ((Ord(Key) < $30) or (Ord(Key) > $39)) then
if PrevIsDigit and (Pos(DecimalSeparator, myEdit.Text) = 0) then
Key := DecimalSeparator
else
Key := #0;
end;
end;
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.079 c