Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.09;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.027 c
15-1186513264
Cyrax
2007-08-07 23:01
2007.09.09
Объявления коммерческого характера на рекламных щитах от частных


2-1186460092
bagos
2007-08-07 08:14
2007.09.09
teechart


6-1168957122
Black_Live
2007-01-16 17:18
2007.09.09
Насколько эти ключи реестра актуальны при сетевой защите?


15-1187180515
Andy BitOff
2007-08-15 16:21
2007.09.09
Есть ли функция возвращающая...


3-1179236373
oleg__
2007-05-15 17:39
2007.09.09
Oracle через ADO