Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1187218781
{RASkov}
2007-08-16 02:59
2007.09.09
Как принудительно обновить размер колонок в ListView?


15-1187027189
Rouse_
2007-08-13 21:46
2007.09.09
Блин, ну до чего уже спамеров довели


9-1159612110
RzCoDer
2006-09-30 14:28
2007.09.09
ОТКРЫТЫЕ исходники КОМЕРЧЕСКОЙ ИГРЫ! =)


15-1186931345
rtQew
2007-08-12 19:09
2007.09.09
Посоветуйте...


8-1165244587
Quicker
2006-12-04 18:03
2007.09.09
Проиграть MID, WAV





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский