Помощь новичкам

ух ты, :slight_smile: не знал, что так тоже можно (массивы так передавать). Сразу не понял, думал что это оператор, весь гугл поломал. вот по этому стараюсь на русском все прописывать, чтоб не путаться :smile: )

В смысле? Там ведь просто берётся первый и второй элемент массива, считываются и передаются как параметры для метода. Что именно из этого вы не знали, и чем тут помогли бы русские названия.

Есть такой код:

begin
  var s := '1234.56789'; //так не работает
//  var s := '1234,56789'; //а так работает
  var numr: real;
  if Real.TryParse(s, numr) then write('1') 
  else write('0'); 
end.

Как бы тут правильно прописать культуру, чтоб видело точку, а не запятую?

Просто сразу не разобрался. Думал это какой-то хитрый оператор (просто в ассемблере такой есть, вот я и зациклился, подвис). Русский помогает с ходу видеть где оператор, а где функция или метод, жаль в паскале нед подсветки, так бы понятней было в программе разбираться. Но это так, из области хотелок. :wink:

Подсветка есть “C:\Program Files (x86)\PascalABC.NET\Highlighting\PascalABCNET.xshd”

Прочитайте внимательно, то не та подсветка.

ну да, методы и функции оно не подсвечивает, и классы тоже, хотя можно высветить begin-end в отдельный цвет =) А по моему вопросу может чего посоветуете, чуть выше?

Когда вы открываете скобочку - появляется такое окошко:

Видете, там слева написано “1 из 2”? Это значит что у real.TryParse есть 2 (второе число) перегрузки, и вы сейчас смотрите на №1 (первое число). Если вы нажмёте на те стрелочки, или у себя на клавиатуре на стрелку вниз или вверх - вам покажет другую перегрузку:

У русских целую и дробную часть числа разделяет запятая, а у европейцев и американцев - точка. То есть это региональные различия которые надо указать (а иначе берёт те что по умолчанию. У вас система на русском, поэтому и выбирает запятую).



Чтоб узнать что в параметр style пихать - ищем его тип (NumberStyles) на msdn (эта ссылка сразу на поиск с введённым запросом). Переходим по первому ответу. Тут видим следующее:

  • “NumberStyles Enumeration”. Enumeration (enum) - это перечислимое. Тип который получается, к примеру, так: type тип_животного=(человек, лев, кот, собака). Переменным этого типа можно присвоить любой 1 из его параметров: var тип_моего_животного: тип_животного := тип_животного.кот.

  • “This enumeration has a FlagsAttribute attribute that allows a bitwise combination of its member values”. “Этот энум имеет особый атирибут (FlagsAttribute), позволяющий побитово комбинировать его элементы”. Подробнее: Справка>>Справочник по языку>>Выражения и операции>>Побитовые операции.

  • “Namespace: System.Globalization”. “Пространство имён: System.Globalization”. То есть этот тип находится в System.Globalization.NumberStyles, а значит каждый элемент можно получить как System.Globalization.NumberStyles.*Имя_элемента*, или прописать в начале программы uses System.Globalization (все пространства имён можно подключить через uses) и тогда уже писать NumberStyles.*Имя_элемента* (хотя целиком тоже позволит).

  • Секция “Members” - тут видно в красивой таблице все элементы этого enum-а. Хотя вы их можете увидеть и в паскале, поставив точку после NumberStyles;



Теперь так же с параметром provider. Ищем его тип на msdn и открываем первый ответ.

IFormatProvider Interface. Интерфейс, это тип которому надо сделать (или взять готовую) реализацию, которая переопределяет работу всех методов (в данном случае он только 1 - GetFormat);

В разделе Remarks (заметка) написанно:

The .NET Framework includes the following three predefined IFormatProvider implementations to provide culture-specific information that is used in formatting or parsing numeric and date and time values;

В .Net есть следующие 3 готовых реализации IFormatProvider И дальше написанные эти 3 реализации со ссылками на них.

NumberFormatInfo (топорный перевод: число, формат, информация) - по названию, явно то что нам надо. Переходим по ссылке к нему.

В разделе Remarks (заметка) есть список, из способов как можно получить переменную с этим типом. Там много всего интересного. Мне удобно new CultureInfo('en-US'), хотя есть способы и попроще.



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

uses System.Globalization;

begin
  var s := '1234.56789';
  var numr: real;
  writeln(
    Real.TryParse(
      s,
      
      {
      NumberStyles.AllowDecimalPoint or//разрешает дробную часть числа
      NumberStyles.AllowLeadingSign or//разрешает поставить + или - перед числом
      NumberStyles.AllowExponent,//разрешает писать 1.2345e+3, к примеру. e+3 значит *10^3
      {}
      NumberStyles.Float,//это комбинация всех предыдущих и +ещё разрешает добавить пробелы до и после числа
      
      new CultureInfo('en-US'),
      numr
    )// ? 1 : 0//  "b ? 1 : 0" значит "if b then 1 else 0". Раскомментируйте, если вам 1/0 нравится больше чем True/False
  );
  writeln(numr);
end.

И если без всех комментариев:

uses System.Globalization;

begin
  var s := '1234.56789';
  var numr: real;
  Real.TryParse(s, NumberStyles.Float, new CultureInfo('en-US'), numr).Println;
  writeln(numr);
end.

Кстати, у real.TryParse тоже есть своя страница на msdn (потому что msdn это официальная справка по .Net, там по странице для всего. А иногда по несколько). Там написано Double.TryParse, потому что Double это .Net имя real. На этой странице есть примеры на C#, которые легко переводятся на этот паскаль.

Хотел бы ещё добавить, что длинно получилось только потому что я старался всё подробно объяснять. На практике, поиск всего что вам понадобится займёт меньше времени чем чтение этого ответа (по крайней мере после некоторого опыта, в 2-5 таких поисков).

2 лайка

Огромное вам гран мерси за столь подробный ответ. Нет, правда, очень и очень. Снимаю капелюха. =)

1 лайк
begin
  var s := '123.456';
  var r: real;
  if Trystrtofloat(s,r) then
    Print(r);
end.

Там культура уже зашита с точкой.

Использовать английскую культуру ради точки - это русофобия

А по моему, русофобия - это разрешать только точку как разделитель. Если указывать культуру при вызове функции - можно сделать настройку, которую пользователь готовой программы сможет переключить (или, возможно, которая переключится сама, в зависимости от того как пользователь вводил раньше).

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

Ну так правильно, языках программирования, а не программах которые на них написаны.

Ну да, кто же спорит. Просто английская культура включает ещё кучу всего кроме точки. Посмотрите, как это сделано в модуле PABCSystem - там это сделано аккуратнее - только разделитель и затронут.

1 лайк

Я тоже считал, что при делении на 0 должно быть исключение. Пока не понял, что мир изменился бесповоротно со времён Вирта :slight_smile:

Я не понял, Вы будете делать в настройках IDE, как в MS Office - локализацию?

При чём тут это? Мне кажется, если сделать запятую вместо точки - это сломает синтаксис в следующем случае:

writeln(3,1 , 2)

Так что за это не бойтесь))). Речь шла только о функционале программ, написанных на паскале, но никак не про компилятор.

Ну так прокатывайте строки через замену точек запятыми и наоборот.

Это костыль.

Ну тогда, как было сказано, “ищите и обрящете, толцыте и отверзнется вам”. А я не хочу изображать кота, которые от безделья сами знаете, чем занимается.